最近一年由於工作需要大部分使用的都是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中文網其他相關文章!