mysql中group by與order by一起使用無效的替代方案
發表時間:2023-09-03 來源:明輝站整理相關軟件相關文章人氣:
[摘要]前言最近一年由于工作需要大部分使用的都是NoSql數據庫,對關系型數據庫感覺越來越陌生,一個由group by和order by 引發的血案由此而生。在此做個記錄,以備不時之需。需求首先,看一下整體的表結構。現在查找每個barCode中最新的數據。由于數據太多,不是很好看到效果。我們就拿一個bar...
前言
最近一年由于工作需要大部分使用的都是NoSql數據庫,對關系型數據庫感覺越來越陌生,一個由group by
和order by
引發的血案由此而生。在此做個記錄,以備不時之需。
需求
首先,看一下整體的表結構。

現在查找每個barCode
中最新的數據。
由于數據太多,不是很好看到效果。我們就拿一個barCode
為4565789
的數據做示例。
SELECTbarCode,
priCommodityID,
createDateFROMtb_history_versionWHEREbarCode = '4565789'ORDER BYcreateDate DESC;

試錯
由于很久沒有寫過sql了。所以首先想到了用 group by和order by組合查詢。
SELECTbarCode,
priCommodityID,
createDateFROMtb_history_versionWHEREbarCode = '4565789'GROUP BYbarCodeORDER BYcreateDate DESC;
結果如下:

可以看到這并不是我們想要的結果,order by
沒有任何效果。
接下來就試一下運用子查詢的方式將兩者結合。先排序再分組
SELECT*FROM(SELECTbarCode,
priCommodityID,
createDateFROMtb_history_versionWHEREbarCode = '4565789'ORDER BYcreateDate DESC) AS AGROUP BYA.barCode;
結果還是令人失望的

解決
上面兩種方式試過了,雖然結果讓人傷心,但是工作還是要繼續。于是就網上找各種資料,看能否用其他方式解決問題。偶然間看到了group_concat
可以實現分組排序,就拿來試一試
SELECTbarCode,
GROUP_CONCAT(
priCommodityIDORDER BYcreateDate DESC) AS priCommodityID,
GROUP_CONCAT(
createDateORDER BYcreateDate DESC) AS createDateFROMtb_history_versionWHEREbarCode = '4565789';
結果如下

可以看到順序沒問題了,但是所有數據都被拼接在一起了。需要進一步做截取字符的處理
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;

ok!到這里就發現已經實現我們剛開始的需求了。
總結
group by
和order by
同時使用是沒有效果的,可以使用group_concat
和groub by
替代。group_concat
內可以實現字段排序。
參考文章
首發地址
http://www.devzxd.top/2017/05/27/mysql-groupby-orderby.html
以上就是mysql中group by和order by同時使用無效的替代方案的詳細內容,更多請關注php中文網其它相關文章!
學習教程快速掌握從入門到精通的SQL知識。