【问题标题】:How to sort by custom count with postgresql?如何使用 postgresql 按自定义计数排序?
【发布时间】:2010-11-27 01:40:33
【问题描述】:

我有两张桌子:

公司:(id,名称)

工人:(身份证、姓名、国家)

我想获取所有公司,并按来自给定国家/地区的员工人数对它们进行排序。

对于查找拥有更多美国工人的公司的查询,结果应为:

#workers from USA | company id | company name 
----------------------------------------------
        90              6           foo corp     
        45              9           bar corp     
        0               3         foobar corp    

我试过了:

select 
    count(w.country='USA') as mycount,
    w.company_id,
    c.company_name
from 
    companies c 
    left join workers w on 
        c.id=w.company_id 
group by 
    w.company_id,
    c.company_name
order by mycount desc;

但这包括所有工人,无论其国家/地区如何。

有什么想法吗?

【问题讨论】:

    标签: sql postgresql join count


    【解决方案1】:

    您可以使用相关子查询轻松做到这一点:

    SELECT
      (SELECT count(*) FROM workers w WHERE w.company_id=c.id AND w.country='USA') AS mycount,
      c.id,
      c.company_name
    FROM
      companies c
    ORDER BY mycount DESC
    

    【讨论】:

      【解决方案2】:

      用 COUNT(*) 替换 COUNT(w.country='USA') 有帮助吗?我相信您的查询需要引用 Companies 表上的字段而不是工人,因为您的左联接留下了为特定公司/国家/地区提取的工人集是空集的可能性。

      试试:

      select count(*) as mycount,
             c.company_id,
             c.company_name
      from   companies c
      left join workers w on c.id=w.company_id 
      group by c.company_id, c.company_name
      order by mycount desc;
      

      【讨论】:

      • 实际上,我希望我的查询返回甚至没有来自美国的工人的公司,在这种情况下 mycount 应该返回 0。
      • 用 COUNT(*) 替换 COUNT(w.country='USA') 会返回所有工人,我想要数字来计算来自美国的工人数量。
      猜你喜欢
      • 2010-11-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-08
      • 2021-09-18
      • 2012-06-28
      相关资源
      最近更新 更多