國慶之間在進行一個消費專案切換時,發現用之前SQL語句匯出的餘額與客戶人員最近消費記錄所顯示的餘額不一致,客戶人員又比較多,還好及時發現沒涼成大錯!現在來記錄一下。
GROUP BY顧名思義,group: 分組,by: 以…; 組合起中來就是以什麼來分組。在mysql理解為以一個欄位或多個欄位來分組顯示結果集,如下。
資料表
執行以下語句
select *
from sc
group by sid
結果如下
結果以sid分組表示出來了,細心一點會發現分組後顯示的記錄是分組前第一條sid對應的值,執行以下語句可以觀察到,如下。
SELECT *,GROUP_CONCAT(score)
FROM sc
GROUP BY sid;
MAX()是mysql裡面的一個聚合函數,用來取最大值的,如下。
SELECT MAX(score)
FROM sc;
結果顯示score列的最大值,是沒有問題的。
要求:匯出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
當然,解決方法不止這一種,具體情況具體討論。