MySQL中g(shù)roup by與max()一起使用的坑
前言
國(guó)慶之間在進(jìn)行一個(gè)消費(fèi)項(xiàng)目切換時(shí),發(fā)現(xiàn)用之前SQL語(yǔ)句導(dǎo)出的余額與客戶(hù)人員最近消費(fèi)記錄所顯示的余額不一致,客戶(hù)人員又比較多,還好及時(shí)發(fā)現(xiàn)沒(méi)涼成大錯(cuò)!現(xiàn)在來(lái)記錄一下。
一 GROUP BY的簡(jiǎn)單介紹
GROUP BY顧名思義,group: 分組,by: 以…; 組合起中來(lái)就是以什么來(lái)分組。在mysql理解為以一個(gè)字段或多個(gè)字段來(lái)分組顯示結(jié)果集,如下。
數(shù)據(jù)表
執(zhí)行以下語(yǔ)句
select *from scgroup by sid
結(jié)果如下
結(jié)果以sid分組表示出來(lái)了,細(xì)心一點(diǎn)會(huì)發(fā)現(xiàn)分組后顯示的記錄是分組前第一條sid對(duì)應(yīng)的值,執(zhí)行以下語(yǔ)句可以觀察到,如下。
SELECT *,GROUP_CONCAT(score) FROM sc GROUP BY sid;
二 MAX()的簡(jiǎn)單介紹
MAX()是mysql里面的一個(gè)聚合函數(shù),用來(lái)取最大值的,如下。
SELECT MAX(score) FROM sc;
結(jié)果顯示score列的最大值,是沒(méi)有問(wèn)題的。
三 group by與max()一起使用
要求:導(dǎo)出sid中score值最大的那條記錄(類(lèi)似與導(dǎo)余額)
之前導(dǎo)余額用的語(yǔ)句類(lèi)似以下SQL語(yǔ)句
SELECT sid,cid,MAX(score) as score FROM sc GROUP BY sid;
咋一看,score的值篩選出來(lái)是最大的,沒(méi)有問(wèn)題,但是核對(duì)score最高值對(duì)應(yīng)的記錄時(shí)發(fā)現(xiàn)是錯(cuò)的,如下
四 原因
我分析了下原因,主要是由group by 分組后顯示的是第一條記錄,而max()取的是相同sid中的最大score值造成的,如下
SELECT sid,cid,score,GROUP_CONCAT(score) FROM sc GROUP BY sid;
相當(dāng)于把第一條記錄的score值用最大值替換了,這顯然是不對(duì)的。
五 解決辦法
我的方法是先用子查詢(xún)把sid和其最大值score先查出來(lái),然后再和原表匹配,如下
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
當(dāng)然,解決方法不止這一種,具體情況具體討論。
到此這篇關(guān)于MySQL中g(shù)roup by與max()一起使用的坑的文章就介紹到這了,更多相關(guān)MySQL group by與max()一起使用內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- MySQL GROUP BY多個(gè)字段的具體使用
- mysql的group?by使用及多字段分組
- mysql5.7同時(shí)使用group by和order by報(bào)錯(cuò)問(wèn)題
- MySQL group by和order by如何一起使用
- MySQL去重該使用distinct還是group by?
- MySQL中使用group by 是總是出現(xiàn)1055的錯(cuò)誤(推薦)
- mysql中count(), group by, order by使用詳解
- Mysql中錯(cuò)誤使用SQL語(yǔ)句Groupby被兼容的情況
- mysql使用GROUP BY分組實(shí)現(xiàn)取前N條記錄的方法
- Mysql中g(shù)roup by 使用中發(fā)現(xiàn)的問(wèn)題
相關(guān)文章
史上最簡(jiǎn)單的MySQL數(shù)據(jù)備份與還原教程(下)(三十七)
這篇文章主要為大家詳細(xì)介紹了史上最簡(jiǎn)單的MySQL數(shù)據(jù)備份與還原教程下篇,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-10-10MySQL8.0移除傳統(tǒng)的.frm文件原因及解讀
MySQL 8.0移除傳統(tǒng)的.frm文件,采用基于InnoDB的事務(wù)型數(shù)據(jù)字典,主要解決了元數(shù)據(jù)不一致、性能優(yōu)化、架構(gòu)簡(jiǎn)化、增強(qiáng)功能支持、兼容性與升級(jí)問(wèn)題,這一變革提高了數(shù)據(jù)庫(kù)的可靠性和性能,為未來(lái)的高級(jí)功能奠定了基礎(chǔ)2025-03-03mysql實(shí)現(xiàn)合并同一ID對(duì)應(yīng)多條數(shù)據(jù)的方法
這篇文章主要介紹了mysql實(shí)現(xiàn)合并同一ID對(duì)應(yīng)多條數(shù)據(jù)的方法,涉及mysql GROUP_CONCAT函數(shù)的使用技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下2016-06-06一步步教你如何使用mysql?binlog恢復(fù)數(shù)據(jù)
Binlog日志即binary?log,是二進(jìn)制日志文件,有兩個(gè)作用,一個(gè)是增量備份,另一個(gè)是主從復(fù)制,下面這篇文章主要給大家介紹了關(guān)于如何使用mysql?binlog?恢復(fù)數(shù)據(jù)的相關(guān)資料,需要的朋友可以參考下2023-04-04mysql實(shí)現(xiàn)將字符串轉(zhuǎn)化成int類(lèi)型
這篇文章主要介紹了mysql實(shí)現(xiàn)將字符串轉(zhuǎn)化成int類(lèi)型方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-08-08解決遠(yuǎn)程連接mysql很慢的方法(mysql_connect 打開(kāi)連接慢)
有次同事提出開(kāi)發(fā)使用的mysql數(shù)據(jù)庫(kù)連接很慢,因?yàn)槲覀兊膍ysql開(kāi)發(fā)數(shù)據(jù)庫(kù)是單獨(dú)一臺(tái)機(jī)器部署的,所以認(rèn)為可能是網(wǎng)絡(luò)連接問(wèn)題導(dǎo)致的。2011-07-07Mysql分片,大數(shù)據(jù)量時(shí)擴(kuò)容解決方案
這篇文章主要介紹了Mysql分片,大數(shù)據(jù)量時(shí)擴(kuò)容解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-06-06