前言
?國慶之間在進行一個消費專案切換時,發現用之前SQL陳述句匯出的余額與客戶人員最近消費記錄所顯示的余額不一致,客戶人員又比較多,還好及時發現沒涼成大錯!現在來記錄一下,
一 GROUP BY的簡單介紹
?GROUP BY顧名思義,group: 分組,by: 以…; 組合起中來就是以什么來分組,在mysql理解為以一個欄位或多個欄位來分組顯示結果集,如下,
資料表

執行以下陳述句
select *
from sc
group by sid
結果如下

結果以sid分組表示出來了,細心一點會發現分組后顯示的記錄是分組前第一條sid對應的值,執行以下陳述句可以觀察到,如下,
SELECT *,GROUP_CONCAT(score)
FROM sc
GROUP BY sid;

二 MAX()的簡單介紹
MAX()是mysql里面的一個聚合函式,用來取最大值的,如下,
SELECT MAX(score)
FROM sc;

結果顯示score列的最大值,是沒有問題的,
三 group by與max()一起使用
要求:匯出sid中score值最大的那條記錄(類似與導余額)
之前導余額用的陳述句類似以下SQL陳述句
SELECT sid,cid,MAX(score) as score
FROM sc
GROUP BY sid;

咋一看,score的值篩選出來是最大的,沒有問題,但是核對score最高值對應的記錄時發現是錯的,如下

四 原因
?我分析了下原因,主要是由group by 分組后顯示的是第一條記錄,而max()取的是相同sid中的最大score值造成的,如下
SELECT sid,cid,score,GROUP_CONCAT(score)
FROM sc
GROUP BY sid;


相當于把第一條記錄的score值用最大值替換了,這顯然是不對的,
五 解決辦法
?我的方法是先用子查詢把sid和其最大值score先查出來,然后再和原表匹配,如下
SELECT a.sid,a.cid,a.score
FROM
sc as a,
(SELECT sid,max(score) as score
FROM sc
GROUP BY sid) as b
WHERE a.sid=b.sid AND a.score=b.score

當然,解決方法不止這一種,具體情況具體討論,
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/181004.html
標籤:其他
上一篇:Oracle與MySQL的學習
下一篇:MySQL學習之索引入門
