MAX Функция для выбора нескольких значений в MYSQL - PullRequest
0 голосов
/ 17 марта 2020

Я использую MYSQL, чтобы получить максимальное количество студентов, которое имеет TA. С помощью этого запроса я получаю все TA и количество студентов каждого TA

SELECT TA.Name as Name, COUNT(Lecture.Student) AS studentcount 
FROM TA 
JOIN Lecture 
WHERE TA.TA_PUID = Lecture.TA 
GROUP BY TA.Name
ORDER BY studentcount DESC;

Мой вывод такой:

David    2 
Justin   2
Matt     2
Jennifer 1
Hannah   1
Timothy  1
Bob      1

Я хочу получить только TA с максимальным значением студенты. Как я могу выполнить это? В этом случае я хочу, чтобы мой вывод был

David  2 
Justin 2
Matt   2

Ответы [ 3 ]

1 голос
/ 17 марта 2020

Вы можете использовать rank():

SELECT t.*
FROM (SELECT TA.Name as Name, COUNT(*) AS studentcount,
             RANK() OVER (ORDER BY COUNT(*) DESC) as seqnum
      FROM TA JOIN
           Lecture l
           ON TA.TA_PUID = l.TA
      GROUP BY TA.Name
    ) t
WHERE seqnum = 1;

Обратите внимание, что за JOIN должно следовать предложение ON, а не предложение WHERE.

0 голосов
/ 17 марта 2020

До MySQL 8 вам нужно будет сделать что-то вроде этого:

SELECT TA.Name as Name, COUNT(Lecture.Student) AS studentcount 
FROM TA INNER JOIN Lecture ON TA.TA_PUID = Lecture.TA 
GROUP BY TA.Name
HAVING studentCount = (
   SELECT COUNT(Student) AS studentcount 
   FROM Lecture
   GROUP BY TA
   ORDER BY studentcount DESC
   LIMIT 1
);

Если вы используете MySQL 8+, функции управления окнами и общие табличные выражения , безусловно, первый выбор.

0 голосов
/ 17 марта 2020

Вы не упоминаете версию MySQL. В MySQL 8.x вы можете использовать CTE (Common Table Expression) для предварительного вычисления значений. Тогда фильтрация проста.

Например:

with
a as (
  SELECT TA.Name as Name, COUNT(Lecture.Student) AS studentcount 
  FROM TA 
  JOIN Lecture 
  WHERE TA.TA_PUID = Lecture.TA 
  GROUP BY TA.Name
)
select * from a where studentcount = (select max(studentcount) from a)
...