Mysql 选择从COUNT()派生的所有类似最大值
我有一个简单的MySQL表,如下所示:Mysql 选择从COUNT()派生的所有类似最大值,mysql,sql,database,Mysql,Sql,Database,我有一个简单的MySQL表,如下所示: Table: Citizen Name Country ---- ------ Adam USA Eva Russia Arman India Peter USA Martin Russia Jack Finland Juno Russia Fox USA Maya Finland 一个简单的查询
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()
并将其与合计值进行比较
顺便说一句,这在大多数其他数据库中要容易得多,因为它们支持窗口/分析功能。如果您需要所有国家/地区,那么查询有点麻烦:
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()
并将其与合计值进行比较
顺便说一句,这在大多数其他数据库中要容易得多,因为它们支持窗口/分析功能。如果您需要所有国家/地区,那么查询有点麻烦:
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()
并将其与合计值进行比较
顺便说一句,这在大多数其他数据库中要容易得多,因为它们支持窗口/分析功能。如果您需要所有国家/地区,那么查询有点麻烦:
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嵌套子查询可以替换为具有
:限制的简单子查询
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 ) ;
中的条件具有
可能会导致非常低效的查询,因此您可以重写为:
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 ;
戈登的查询稍微简化了一点
- 您不需要
,除非COUNT(Name)
是可为空的列Nname
- 2嵌套子查询可以替换为具有
:限制的简单子查询
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 ) ;
中的条件具有
可能会导致非常低效的查询,因此您可以重写为:
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 ;
戈登的查询稍微简化了一点
- 您不需要
,除非COUNT(Name)
是可为空的列Nname
- 2嵌套子查询可以替换为具有
:限制的简单子查询
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 ) ;
中的条件具有
可能会导致非常低效的查询,因此您可以重写为:
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 ;
戈登的查询稍微简化了一点
- 您不需要
,除非COUNT(Name)
是可为空的列Nname
- 2嵌套子查询可以替换为具有
:限制的简单子查询
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 ) ;
中的条件具有
可能会导致非常低效的查询,因此您可以重写为:
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 ;