繁体   English   中英

选择从COUNT()派生的所有相似的MAX值

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM