明輝手游網(wǎng)中心:是一個免費(fèi)提供流行視頻軟件教程、在線學(xué)習(xí)分享的學(xué)習(xí)平臺!

mysql中g(shù)roup by與order by一起使用無效的替代方案

[摘要]前言最近一年由于工作需要大部分使用的都是NoSql數(shù)據(jù)庫,對關(guān)系型數(shù)據(jù)庫感覺越來越陌生,一個由group by和order by 引發(fā)的血案由此而生。在此做個記錄,以備不時(shí)之需。需求首先,看一下整體的表結(jié)構(gòu),F(xiàn)在查找每個barCode中最新的數(shù)據(jù)。由于數(shù)據(jù)太多,不是很好看到效果。我們就拿一個bar...

前言

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

需求

首先,看一下整體的表結(jié)構(gòu)。
表結(jié)構(gòu)
現(xiàn)在查找每個barCode中最新的數(shù)據(jù)。

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

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

示例數(shù)據(jù)

試錯

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

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

結(jié)果如下:
錯誤結(jié)果:1
可以看到這并不是我們想要的結(jié)果,order by沒有任何效果。
接下來就試一下運(yùn)用子查詢的方式將兩者結(jié)合。先排序再分組

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

結(jié)果還是令人失望的
錯誤結(jié)果:2

解決

上面兩種方式試過了,雖然結(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é)果如下
結(jié)果一
可以看到順序沒問題了,但是所有數(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;

正確結(jié)果
ok!到這里就發(fā)現(xiàn)已經(jīng)實(shí)現(xiàn)我們剛開始的需求了。

總結(jié)

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

參考文章


首發(fā)地址

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

以上就是mysql中g(shù)roup by和order by同時(shí)使用無效的替代方案的詳細(xì)內(nèi)容,更多請關(guān)注php中文網(wǎng)其它相關(guān)文章!


學(xué)習(xí)教程快速掌握從入門到精通的SQL知識。