[英]Selecting all the similar MAX values derived from COUNT()
我有一个简单的MySQL表,看起来是这样的:
Table: Citizen
Name Country
---- ------
Adam USA
Eva Russia
Arman India
Peter USA
Martin Russia
Jack Finland
Juno Russia
Fox USA
Maya Finland
一个简单的查询,例如
SELECT Country, COUNT(Name) People FROM Citizen GROUP BY Country
会给我
Country People
------- ------
USA 3
Russia 3
Finland 2
India 1
我想找到人数最多的国家/地区。 如果是平局(即两个国家的最大人数相同),请列出所有此类国家。 结果表应如下所示
Country MaxPeople
------- ------
USA 3
Russia 3
我了解了一些有关派生表的知识,并提出了以下查询:
SELECT Country, MAX(TotCit)
FROM (SELECT Country, COUNT(People) TotCit
FROM Citizen GROUP BY Country)
AS CitTable
导致
Country Max(TotCit)
------- -----------
Finland 3
任何可能的解决方案?
如果您需要所有国家/地区,则查询有点麻烦:
SELECT Country, COUNT(Name) as People
FROM Citizen
GROUP BY Country
HAVING COUNT(Name) = (select max(cnt)
from (select COUNT(Name) as cnt
from Citizen
group by Country
) c
);
该查询只是您要查找的内容。 HAVING
子句首先计算每个国家的计数,然后计算max()
并将其与合计值进行比较。
顺便说一下,在大多数其他数据库中,这很容易,因为它们支持窗口/分析功能。
Gordon的查询简化了一点。
COUNT(Name)
,除非Nname
是可为空的列。 2嵌套子查询可以替换为带有LIMIT
的简单子查询:
SELECT Country, COUNT(*) AS People FROM Citizen GROUP BY Country HAVING COUNT(*) = ( SELECT COUNT(*) AS People FROM Citizen GROUP BY Country ORDER BY People DESC LIMIT 1 ) ;
HAVING
的条件可能会导致查询效率非常低,因此您可以将其重写为:
SELECT
g.Country, g.People
FROM
( SELECT COUNT(*) AS People
FROM Citizen
GROUP BY Country
ORDER BY cnt DESC
LIMIT 1
) AS m
JOIN
( SELECT Country, COUNT(*) AS People
FROM Citizen
GROUP BY Country
) AS g
ON g.People = m.People ;
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.