[英]SELECT MAX(COUNT) MySQL
我是 MySQL 新手,我現在有一個任務要做,我有三個表:
我應該
獲取學生注冊最多的課程名稱,如果與其他課程有沖突或聯系,則按升序檢索該課程。
我嘗試了幾個查詢,但它們“不夠高效”
SELECT course.name FROM (
SELECT CI ,MAX(Total) FROM
(
SELECT course_id as CI,COUNT(*) AS Total
FROM grades
GROUP BY course_id ASC
) AS Results
) AS x
INNER JOIN courses ON x.CI = courses.id
和
SELECT courses.name FROM (
SELECT course_id, COUNT(*) AS how_many
FROM grades
GROUP BY course_id ASC
HAVING how_many = (
SELECT COUNT(*) AS how_many
FROM grades
GROUP BY course_id
ORDER BY how_many DESC
LIMIT 1
)
LIMIT 1
) AS X
JOIN courses ON X.course_id=courses.id
有沒有更高效的查詢?
在我看來,您的兩次查詢嘗試在邏輯上都不正確。 您應該將courses
加入到grades
中,以獲取每門課程注冊的學生人數。 關於效率,假設您運行 MySQL 8+, RANK
分析函數是性能最高的選項之一:
WITH cte AS (
SELECT c.id, c.name, RANK() OVER (ORDER BY COUNT(*) DESC, c.name) rnk
FROM courses c
INNER JOIN grades g ON g.course_id = c.id
GROUP BY c.id, c.name
)
SELECT id, name
FROM cte
WHERE rnk = 1;
在早期版本的 MySQL 中,我們可以使用LIMIT
查詢:
SELECT c.id, c.name
FROM courses c
INNER JOIN grades g ON g.course_id = c.id
GROUP BY c.id, c.name
ORDER BY COUNT(*) DESC, c.name
LIMIT 1;
您可以使用帶有LIMIT
子句的ORDER BY
子句來獲得所需的內容,而無需聚合兩次:
WITH enrollments AS (
SELECT course_id, COUNT(DISTINCT student_id) AS num_enrollments
FROM grades
GROUP BY course_id
)
SELECT *
FROM enrollments e
INNER JOIN courses c
ON e.course_id = c.id
ORDER BY e.num_enrollments DESC, c.name ASC
LIMIT 1
子查詢將通過聚合學生來獲取注冊信息,然后將其與課程連接以使用課程名稱。
然后數據按以下順序排序:
並且只考慮第一行。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.