[英]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.