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