Использование Count и Max в SQL-запросах - PullRequest
1 голос
/ 18 сентября 2011

У меня есть две таблицы, из которых я пытаюсь запросить, Регистрация и Курс. В таблице курсов есть только одна запись для каждого курса, но в таблице регистрации есть запись для каждого студента, зачисленного на любой курс, поэтому может быть 30 записей для одного курса. Моя задача состоит в том, чтобы найти курс, в котором зарегистрировано наибольшее количество студентов, и распечатать название курса, а также количество заявок на этот курс. Вот мой запрос до сих пор

select c.CourseCode ,(SELECT count( * ) FROM Enrollment WHERE CourseCode = c.CourseCode) as test from Course c ;

это дает мне результаты:

CS227 - 29

CS228 - 34

CS309 - 31

CS311 - 25 , т. д., что хорошо, но СЕЙЧАС, как мне распечатать только тот класс, у которого больше всего зачислений (в данном случае, CS228). Я пытался использовать max (), но я не могу заставить что-либо работать.

Вот структура таблицы

создать таблицу курса ( CourseCode char (50), CourseName char (50), PreReq char (6));

создать таблицу регистрации ( CourseCode char (6) NOT NULL, SectionNo int NOT NULL, StudentID char (9) НЕ NULL ссылки Студент, Чар (4) NOT NULL, первичный ключ (CourseCode, StudentID), ссылки на внешний ключ (CourseCode, SectionNo));

Ответы [ 3 ]

3 голосов
/ 18 сентября 2011

Просто возьмите верхнюю 1 после заказа по количеству.

То есть:

Select Top 1 A.CourseCode, Count(*) From Course A inner join Enrollment B on (A.CourseCode=B.CourseCode) 
Group By A.CourseCode
Order By Count(*) DESC

Также - используйте внутреннее соединение, как я показал здесь, а не подзапрос. Мне действительно нравятся подзапросы, и этот будет работать, но он просто не подходит для такого рода запросов!

0 голосов
/ 18 сентября 2011
SELECT 
      c.CourseCode, 
      c.CourseName,
      COUNT(*) AS cnt 
FROM
      Course AS c
  INNER JOIN
      Enrollment AS e
          ON c.CourseCode = e.CourseCode 
GROUP BY
      c.CourseCode
HAVING 
      COUNT(*) = 
         ( SELECT  
                 COUNT(*) AS cnt 
           FROM
                 Enrollment AS e
           GROUP BY
                 e.CourseCode
           ORDER BY
                 cnt DESC
           LIMIT 1
         )
0 голосов
/ 18 сентября 2011

Исходя из вашего комментария, я думаю, что запрос на удар - это то, что вам нужно, хотя он не проверен, и я не совсем уверен, что предложение HAVING действительно. Судя по документации на странице MySQL, это должно работать.

SELECT A.CourseCode, COUNT(*) AS count FROM Course A
JOIN Enrollment B ON A.CourseCode = B.CourseCode
GROUP BY A.CourseCode
HAVING count = MAX(count)

Что касается производительности, я не могу сказать, является ли хорошей идеей запуск MAX для агрегатной функции (вероятно, нет).

В противном случае просто используйте другой запрос, чтобы вернуть верхний X, и просто выполните сравнение с предыдущим числом.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...