2014-02-19 2 views
0

У меня есть простая таблица MySQL выглядит следующим образом:Выбор всех аналогичных значений MAX, полученные из COUNT()

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 

Любое возможное решение?

ответ

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() и сравнивает это с агрегированным значением.

Кстати, это намного проще в большинстве других баз данных, поскольку они поддерживают оконные/аналитические функции.

0

Запрос от Гордона, упрощенного.

  • вам не нужно 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 ; 
Смежные вопросы