Mysql 选择从COUNT()派生的所有类似最大值

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 一个简单的查询

我有一个简单的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()
并将其与合计值进行比较


顺便说一句,这在大多数其他数据库中要容易得多,因为它们支持窗口/分析功能。

如果您需要所有国家/地区,那么查询有点麻烦:

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 ;