Пытаясь выяснить, как найти максимальное количество - PullRequest
0 голосов
/ 29 апреля 2019

Какая команда имеет наибольшее количество членов в своем списке?

Хорошо, ниже приведен код, который я сейчас ввел. Возвращает все команды, а также количество человек в каждой команде. Я не уверен, как его кодировать, чтобы отображать только команду с наибольшим количеством участников, поскольку, когда я пытаюсь использовать функцию max и функцию count, я получаю сообщение об ошибке.

SELECT Team_Name, COUNT(Member.Student_ID_Num) 
FROM Teams 
JOIN Member ON Teams.Team_Number = Member.Team_Number 
GROUP BY Team_Name

Ответы [ 3 ]

3 голосов
/ 29 апреля 2019

вы можете попробовать ниже - используя лимит и заказ по desc

Select Team_Name, count(Member.Student_ID_Num) as cnt
from Teams join Member on Teams.Team_Number = Member.Team_Number 
group by Team_Name
order by cnt desc
limit 1
2 голосов
/ 29 апреля 2019

Если вы используете MySQL 8+, здесь вам пригодится функция ROW_NUMBER:

SELECT Team_Name, cnt
FROM
(
    SELECT t.Team_Name, COUNT(*) AS cnt,
        ROW_NUMBER() OVER (ORDER BY COUNT(*) DESC) rn
    FROM Teams t
    INNER JOIN Member m
        ON t.Team_Number = m.Team_Number
    GROUP BY t.Team_Name
) t
WHERE rn = 1;

Если вместо этого вы хотите, чтобы все связи имели наибольшее количество очков, если две или более команд связаны, то замените ROW_NUMBER на RANK.

Если вам нужно сделать это по старинке, без LIMIT или ROW_NUMBER, то приготовьтесь к действительно ужасному запросу:

SELECT
    t.Team_Name,
    COUNT(*) AS cnt
FROM Teams t
INNER JOIN Member m
    ON t.Team_Number = m.Team_Number
GROUP BY t.Team_Name
HAVING COUNT(*) = (SELECT MAX(cnt) FROM (SELECT COUNT(*) AS cnt
                                         FROM Teams t
                                         INNER JOIN Member m
                                             ON t.Team_Number = m.Team_Number
                                         GROUP BY t.Team_Name) t );
0 голосов
/ 29 апреля 2019

Чтобы получить команду с наибольшим количеством участников, нам не нужно присоединяться (если только мы не хотим показывать количество участников).Следует иметь в виду, что может быть несколько команд, совместно использующих одинаковое максимальное число членов.

По-старому, в стандартном SQL до появления какого-либо предложения limit (FETCH FIRST ROWS в стандартном SQL) было следующее:

  1. Количество участников на номер команды.
  2. Получите максимальное количество.
  3. Получите номера команд с этим максимальным количеством.
  4. Получите команды для этих номеров команд.

Запрос:

select *
from teams
where team_number in
(
  select team_number
  from member
  group by team_number
  having count(*) =
  (
    select max(cnt) as max_cnt
    from
    (
      select count(*) as cnt
      from member
      group by team_number
    ) counted
  )
);

Начиная с MySQL 8, мы бы предпочли использовать функцию wnindow:

select *
from teams
where (team_number, 1) in
(
  select team_number, rank() over (order by count(*) desc)
  from member
  group by team_number
);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...