mysql中g(shù)roup by和order by同時(shí)使用無效的替代方案

前言

最近一年由于工作需要大部分使用的都是nosql數(shù)據(jù)庫,對(duì)關(guān)系型數(shù)據(jù)庫感覺越來越陌生,一個(gè)由group by和order by 引發(fā)的血案由此而生。在此做個(gè)記錄,以備不時(shí)之需。

需求

首先,看一下整體的表結(jié)構(gòu)。
mysql中g(shù)roup by和order by同時(shí)使用無效的替代方案
現(xiàn)在查找每個(gè)barCode中最新的數(shù)據(jù)。

由于數(shù)據(jù)太多,不是很好看到效果。我們就拿一個(gè)barCode為4565789的數(shù)據(jù)做示例。

SELECTbarCode,  ????priCommodityID,  ????createDateFROMtb_history_versionWHEREbarCode?=?'4565789'ORDER?BYcreateDate?DESC;

mysql中g(shù)roup by和order by同時(shí)使用無效的替代方案

試錯(cuò)

由于很久沒有寫過sql了。所以首先想到了用 group by和order by組合查詢。

SELECTbarCode,  ????priCommodityID,  ????createDateFROMtb_history_versionWHEREbarCode?=?'4565789'GROUP?BYbarCodeORDER?BYcreateDate?DESC;

結(jié)果如下:
mysql中g(shù)roup by和order by同時(shí)使用無效的替代方案
可以看到這并不是我們想要的結(jié)果,order by沒有任何效果。
接下來就試一下運(yùn)用子查詢的方式將兩者結(jié)合。先排序再分組

SELECT*FROM(SELECTbarCode,  ????????????priCommodityID,  ????????????createDateFROMtb_history_versionWHEREbarCode?=?'4565789'ORDER?BYcreateDate?DESC)?AS?AGROUP?BYA.barCode;

結(jié)果還是令人失望的
mysql中g(shù)roup by和order by同時(shí)使用無效的替代方案

解決

上面兩種方式試過了,雖然結(jié)果讓人傷心,但是工作還是要繼續(xù)。于是就網(wǎng)上找各種資料,看能否用其他方式解決問題。偶然間看到了group_concat可以實(shí)現(xiàn)分組排序,就拿來試一試

SELECTbarCode,  ????GROUP_CONCAT(  ????????priCommodityIDORDER?BYcreateDate?DESC)?AS?priCommodityID,  ????GROUP_CONCAT(  ????????createDateORDER?BYcreateDate?DESC)?AS?createDateFROMtb_history_versionWHEREbarCode?=?'4565789';

結(jié)果如下
mysql中g(shù)roup by和order by同時(shí)使用無效的替代方案
可以看到順序沒問題了,但是所有數(shù)據(jù)都被拼接在一起了。需要進(jìn)一步做截取字符的處理

SELECTbarCode,  ????SUBSTRING_INDEX(  ????????group_concat(  ????????????priCommodityIDORDER?BYcreateDate?DESC),',',1)?AS?priCommodityID,  ????SUBSTRING_INDEX(  ????????group_concat(  ????????????createDateORDER?BYcreateDate?DESC),',',1)?AS?createDateFROMtb_history_versionWHEREbarCode?=?'4565789'GROUP?BYbarCode;

mysql中g(shù)roup by和order by同時(shí)使用無效的替代方案
ok!到這里就發(fā)現(xiàn)已經(jīng)實(shí)現(xiàn)我們剛開始的需求了。

總結(jié)

group by和order by同時(shí)使用是沒有效果的,可以使用group_concat和groub by替代。group_concat內(nèi)可以實(shí)現(xiàn)字段排序。

參考文章

首發(fā)地址

http://www.devzxd.top/2017/05/27/mysql-groupby-orderby.html

? 版權(quán)聲明
THE END
喜歡就支持一下吧
點(diǎn)贊11 分享