1. 程式人生 > >mysql中group by和order by同時使用無效的替代方案

mysql中group by和order by同時使用無效的替代方案

前言

最近一年由於工作需要大部分使用的都是NoSql資料庫,對關係型資料庫感覺越來越陌生,一個由group byorder by 引發的血案由此而生。在此做個記錄,以備不時之需。

需求(得到所有barCode的最新的一條資料)

首先,看一下整體的表結構。 

現在查詢每個barCode中最新的資料。

由於資料太多,不是很好看到效果。我們就拿一個barCode4565789的資料做示例。

SELECT
    barCode,
    priCommodityID,
    createDate
FROM
    tb_history_version
WHERE
    barCode = '4565789'
ORDER BY
    createDate DESC;

試錯

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

SELECT
    barCode,
    priCommodityID,
    createDate
FROM
    tb_history_version
WHERE
    barCode = '4565789'
GROUP BY
    barCode
ORDER BY
    createDate DESC;

結果如下: 

解決

上面兩種方式試過了,雖然結果讓人傷心,但是工作還是要繼續。於是就網上找各種資料,看能否用其他方式解決問題。偶然間看到了group_concat

可以實現分組排序,就拿來試一試

SELECT
    barCode,
    GROUP_CONCAT(
        priCommodityID
        ORDER BY
            createDate DESC
    ) AS priCommodityID,
    GROUP_CONCAT(
        createDate
        ORDER BY
            createDate DESC
    ) AS createDate
FROM
    tb_history_version
WHERE
    barCode = '4565789';

結果如下 

可以看到順序沒問題了,但是所有資料都被拼接在一起了。需要進一步做擷取字元的處理

SELECT
    barCode,
    SUBSTRING_INDEX(
        group_concat(
            priCommodityID
            ORDER BY
                createDate DESC
        ),
        ',',
        1
    ) AS priCommodityID,
    SUBSTRING_INDEX(
        group_concat(
            createDate
            ORDER BY
                createDate DESC
        ),
        ',',
        1
    ) AS createDate
FROM
    tb_history_version
WHERE
    barCode = '4565789'
GROUP BY
    barCode;

ok!到這裡就發現已經實現我們剛開始的需求了。

總結
group by和order by同時使用是沒有效果的,可以使用group_concat和groub by替代。group_concat內可以實現欄位排序。

參考文章
http://www.cnblogs.com/jjcc/p/5896588.html

首發地址
http://www.devzxd.top/2017/05/27/mysql-groupby-orderby.html