【问题标题】:How to sort by count with postgresql?如何使用 postgresql 按计数排序?
【发布时间】:2010-11-27 00:34:46
【问题描述】:

我有两张桌子:

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 分组:/

有什么想法吗?

【问题讨论】:

    标签: sql postgresql join count


    【解决方案1】:

    试试这个作为子查询:

    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
    

    【讨论】:

      【解决方案2】:

      您已将表和列别名为同一事物,所以不要这样做。这不是无效的,只是很难遵循。

      无论如何,请在group by 中包含您选择的所有非聚合列:

      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;
      

      【讨论】:

      • 我的表实际上必须大于这两列(城市和名称),我应该按所有列分组吗?
      • 我认为是的,您应该让 GROUP BY 子句起作用,否则查询将失败
      • @Ggolo:您选择的任何列,都必须group by
      • 好的,我试过查询,效果很好,只有一个问题,如果公司没有工人,它不会出现在结果中。有什么方法可以让所有公司出现在结果中,即使他们有 0 个工人?
      • 如果你愿意回答我也有类似的问题 :) stackoverflow.com/questions/1403456/…
      【解决方案3】:

      如果不希望返回计数结果(由于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 测试

      【讨论】:

        猜你喜欢
        • 2010-11-27
        • 2013-03-17
        • 1970-01-01
        • 2021-08-16
        • 2016-01-08
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-06-01
        相关资源
        最近更新 更多