一次查询一对多计数?

ih99xse1  于 2021-06-21  发布在  Mysql
关注(0)|答案(3)|浏览(331)

我有一段时间没碰后端了。。所以请原谅我,如果这是超级简单。我在用lumen v.5.6.1。

| table.sets     |    | table.indexed_items             |
|----------------|    |---------------------------------|
| ID | SET       |    | ID | setId | itemId | have      |    
|----|-----------|    |----|-------|--------|-----------|
| 1  | set name 1|    | 1  | 3     | 1      | 2         |
| 2  | set name 2|    | 2  | 3     | 2      | 1         |
| 3  | set name 3|    | 3  | 3     | 3      | 4         |
                      | 4  | 2     | 4      | 1         |
                      | 5  | 2     | 5      | 3         |
                      | 6  | 2     | 6      | 1         |

如何在一个查询groupedby/distinct by setid(set name作为左连接?)中返回如下返回:

[
   setId: 2,
   name: 'set name 2',
   haveTotal: 5,
],
[
   setId: 3,
   name: 'set name 3',
   haveTotal: 7,
]
6jygbczu

6jygbczu1#

如果你正在使用或想使用雄辩,你可以这样做: $sets = App\Sets::withCount('indexed_items')->get(); 这将返回具有列名的集合 indexed_items_count 显然,您需要根据您的型号名称进行更改。
这是文件

wgeznvg7

wgeznvg72#

我总是在我的项目中使用计数关系记录。

$sets->indexed_items->count();
nkkqxpd9

nkkqxpd93#

这是一个原始的mysql查询,应该可以工作。要将其转换为laravel应该不需要太多的工作,尽管您可能需要使用 DB::raw 一两次。

SELECT
    s.ID AS setId,
    s.`SET` AS name,
    COALESCE(SUM(ii.have), 0) AS haveTotal
FROM sets s
LEFT JOIN indexed_items ii
    ON s.ID = ii.setId
GROUP BY
    s.ID;

演示

如果不想返回在 indexed_items 表,则可以删除对的调用 COALESCE ,也可以使用内部联接而不是左联接。
注意,使用 SET 命名表和列不是一个好主意,因为它是一个mysql关键字。

相关问题