我有两张桌子:

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中测试

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top