mysql分組后獲取每個組排序后的第一條數據(整行)


https://blog.csdn.net/persistencegoing/article/details/92764058

 

All rights reserved.No part of this article may be reproduced or distributed by any means,or stored in a database or retrieval system,without the prior written permission of persistenceGoing author
https://blog.csdn.net/persistencegoing/article/details/84376427

     有一個學生分數表student,數據結構是這樣的

     id(當前表ID)    student_id(學生ID)    line(分數)   subject_type(科目類型)

 1                           1                             80                       1 

 2                           1                             78                       1 

 3                           1                             56                       1 

 4                           2                             99                       1 

 5                           2                             20                       1 

 

 

我想根據學生分組  ,得到每個分組中分數最高的那一條數據:

先來幾種錯誤的寫法:
(1)SELECT
    max.*, MAX(max.line) lineMax
FROM
    (SELECT * FROM student) max
GROUP BY
    student_id

這種寫法你會發現line和lineMax的列中數據可能不一致

(2)SELECT
    max.*, MAX(max.line) lineMax
FROM
    (
        SELECT
            *
        FROM
            student
        ORDER BY
            line DESC
    ) max
GROUP BY
    student_id

你可能會說排序之后再分組就對了,抱歉,這種情況下對於某些小伙伴可能還是會有問題

(3)SELECT
    max.*, MAX(max.line) lineMax
FROM
    (
        SELECT
            *
        FROM
            student
        ORDER BY
            line DESC
    ) max
GROUP BY
    student_id
HAVING lineMax=line

這種情況下,表面上數據是對的,但是數據量大了之后你會發現有些數據丟失,其實還是錯的

 

 

     正確寫法:
SELECT
    max.*, MAX(max.line) lineMax
FROM
    (
        SELECT
            *
        FROM
            student 
        ORDER BY
            line DESC
    LIMIT 100
    ) max
GROUP BY
    student_id

    在mysql5.7版本之后,必須再排序之后加上limit關鍵字,20萬所測試的數據是正確的,親測驗證

注意: 
limit 是必須要加的,如果不加的話,數據不會先進行排序,通過 explain 查看執行計划,可以看到沒有 limit 的時候,少了一個 DERIVED 操作。

可用以下SQL對每組數據進行驗證

SELECT
    *
FROM
    student
WHERE
    student_id = 69
ORDER BY
    line DESC
LIMIT 100


————————————————
版權聲明:本文為CSDN博主「persistenceヾ(◍°∇°◍)ノ」的原創文章,遵循 CC 4.0 BY-SA 版權協議,轉載請附上原文出處鏈接及本聲明。
原文鏈接:https://blog.csdn.net/persistencegoing/article/details/92764058


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM