簡體   English   中英

選擇最大(計數)MySQL

[英]SELECT MAX(COUNT) MySQL

我是 MySQL 新手,我現在有一個任務要做,我有三個表:

  1. 學生(身份證,姓名)
  2. 課程(ID,名稱)
  3. 成績(id,student_id(FK),course_id(FK),成績)

我應該

獲取學生注冊最多的課程名稱,如果與其他課程有沖突或聯系,則按升序檢索該課程。

我嘗試了幾個查詢,但它們“不夠高效”

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM