如何用postgresql按计数排序?
-
05-07-2019 - |
题
我有两张桌子:
Companies: (id, name, city)
Workers: (id, name)
我想让所有公司按照雇员人数排序。
结果应该给出:
count | company id | company name | city
------------------------------------------
90 6 foo corp NY
45 9 bar corp LA
0 3 foobar corp HO
我试过了:
select
c.*,
count(w.id) as c
from
companies c
left join
workers w
on
c.id = w.company_id
group by
c.id
order by
c desc;
但这不起作用,因为它告诉我也要按g.name分组:/
有什么想法吗?
解决方案
你把表和列别名化为同一个东西,所以不要这样做。这不是无效的,只是很难遵循。
无论如何,请包括您选择的组中未聚合的所有列:
select
count(w.id) as mycount,
w.company_id,
c.company_name,
c.city
from
companies c
left join workers w on
c.id=w.company_id
group by
w.company_id,
c.company_name,
c.city
order by mycount desc;
其他提示
尝试将其作为子查询:
SELECT C.*
FROM
(
SELECT C.Id, C.Company_Name, C.City, COUNT(W.Id) AS CNT
FROM Companies C
LEFT JOIN Workers W ON W.Company_Id = C.Id
GROUP BY C.Id, C.Company_Name, C.City
) T
ORDER BY T.CNT
如果您不希望返回计数结果(因为ORM框架左右),您可以直接在order by子句中应用它:
select
c.*
from
companies c
left join
workers w
on
c.id = w.company_id
group by
c.id
order by
count(w.id) desc;
在postgreSQL 11中测试
不隶属于 StackOverflow