【问题标题】:One to Many Count with one query?一个查询一对多计数?
【发布时间】:2018-10-09 12:36:35
【问题描述】:

我有一段时间没有接触后端了。如果这非常简单,请原谅我。我正在使用 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         |

我如何在一个查询中返回,按 setId 分组/区分(将集合名称作为左连接?)得到这样的返回:

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

【问题讨论】:

  • 您是在寻找 PHP 代码、MySQL 代码还是两者兼有?
  • @TimBiegeleisen 也可以,对你来说更容易。如果你只想给我原始的 SQL,我可以转换它。

标签: mysql laravel laravel-5 lumen


【解决方案1】:

这是一个应该可以工作的原始 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;

Demo

如果您不想返回在indexed_items 表中没有条目的集合,那么您可以删除对COALESCE 的调用,并且您也可以使用内连接而不是左连接。

请注意,使用SET 命名表和列不是一个好主意,因为它是 MySQL 关键字。

【讨论】:

  • 非常感谢!这行得通,是的,这些不是任何东西的真实名称。祝你有美好的一天!
【解决方案2】:

如果您正在使用或想要使用 eloquent,您可以执行以下操作:

$sets = App\Sets::withCount('indexed_items')->get();

这将返回一个列名为indexed_items_count的集合

显然,您需要根据您的型号名称进行更改。

Here are the docs

【讨论】:

  • 这个我也要看看,也谢谢你的回答!
【解决方案3】:

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

$sets->indexed_items->count();

【讨论】:

  • 我也使用 this.but 使用 with in 在 foreach 中获取多行,这会降低您的项目速度
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-01-18
  • 1970-01-01
  • 1970-01-01
  • 2014-09-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多