拥有用户,公司和company_user数据透视表:如何让公司按其用户排序?
以下查询几乎就是这样。这里唯一的问题是我得到的公司至少有一个用户。没有用户关系的每家公司都没有被考虑在内。
$companies = Company::->with('users')
->join('company_user', 'companies.id', '=', 'company_user.company_id')
->selectRaw('companies.*, count(*) as `aggregate`')
->groupBy('companies.id')
->orderBy('aggregate', 'desc')
->get();
示例输出应为:
company_1 (users: 4)
company_2 (users: 2)
company_3 (users: 0)
company_4 (users: 0)
上述查询的输出是:
company_1 (users: 4)
company_2 (users: 2)
答案 0 :(得分:1)
您的某些公司似乎被INNER JOIN
删除了。如果是这样,您可以尝试使用LEFT JOIN
和SUM
(以计算行的基数)来保留缺失的数据:
$companies = Company::->with('users')
->leftJoin('company_user', 'companies.id', '=', 'company_user.company_id')
->selectRaw('companies.*,
sum(case when company_user.company_id is null then 0 else 1 end) as `aggregate`')
->groupBy('companies.id')
->orderBy('aggregate', 'desc')
->get();
我最初也尝试使用COUNT()
,但似乎始终坚持将NULL
行计为1.相反,我使用{{切换到SUM()
1}}表达式并且工作正常。
请按照以下链接查看正在运行的演示: