是否可以在不加入的情况下按计数(不同)进行分组?

Posted

技术标签:

【中文标题】是否可以在不加入的情况下按计数(不同)进行分组?【英文标题】:Is it possible to do a group by count(distinct) without a join? 【发布时间】:2012-01-03 04:22:24 【问题描述】:
Table 1 : (Company)

ID Name
1  A
2  B
3  C

每家公司 (pk = ID) 可以拥有一名或多名员工。

Table 2 :  (Employee)  (CompanyID referencing ID)

CompanyID EmpID Name
1         1     Joe
1         2     Doe
1         3     Boe
2         4     Lou
3         5     Su  
3         6     Ram

查询:

select CompanyID, count(*) from Employee group by CompanyID having count(*) > 1; # Lists companies and their counts.

CompanyID count(*)
1         3  
3         2

对于这个查询,我只需要一个包含不同 CompanyID 计数的结果。因此,在这种情况下为“2”[公司 A 和 C]。

简而言之,我正在寻找拥有 2 名或更多员工的公司。

在没有临时表或连接的情况下,是否可以得到结果?我正在使用 mysql

【问题讨论】:

【参考方案1】:

是的,可以使用子查询:

SELECT COUNT(*)
FROM
  ( SELECT 1
    FROM Employee 
    GROUP BY CompanyID 
    HAVING COUNT(*) > 1
  ) AS grp

或:

SELECT COUNT(DISTINCT CompanyID) 
FROM Employee AS e
WHERE EXISTS
      ( SELECT *
        FROM Employee AS e2
        WHERE e2.CompanyID = e.CompanyId
          AND e2.EmpID <> e.EmpID
      )

或者如果COUNT(*) 很慢,您可以使用MIN()MAX()

SELECT COUNT(*)
FROM
  ( SELECT 1 
    FROM Employee 
    GROUP BY CompanyID 
    HAVING MAX(EmpID) > MIN(EmpId)
  ) AS grp

【讨论】:

错误代码:1248。每个派生表都必须有自己的别名。所以我猜需要一个别名.. 是的,子查询中需要别名。【参考方案2】:

是的:

select count(*) from
(select CompanyID from Employee group by CompanyID having count(*) > 1) v

或对于范围:

select count(*) from
(select CompanyID from Employee group by CompanyID 
 having count(*) >= 5 and count(*) < 10) v

【讨论】:

我正在考虑这个解决方案,但我认为这可能不是最有效的。可能就是这样!谢谢... 我们可以对范围进行计数(*)吗?比如说,有 5 名或更多员工但少于 10 名员工的公司数量? 对不起,我明白了:count() >= 5 或 count()

以上是关于是否可以在不加入的情况下按计数(不同)进行分组?的主要内容,如果未能解决你的问题,请参考以下文章

不使用熊猫分组

有没有办法在不为类别制作不同的分页组件的情况下根据特定类别对产品进行计数?

在不破坏顺序的情况下对列进行分组

我可以在不重置浏览器状态的情况下按顺序运行多个 RSpec/Selenium 测试吗?

有没有一种方法可以让我在不输入任何内容的情况下按下回车,并且代码会假设接下来要做啥?

是否可以在不使用 SQL 连接的情况下对不同年份进行每周比较?