mysqlでgroupbyとorder byが無効な代替案を同時に使用

2733 ワード

前言
最近の1年は仕事のため大部分がNoSqlデータベースを使う必要があるため、関係型データベースに対してますますよく知らない感じがして、1つの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;

結果は以下の通りです.これは私たちが望んでいる結果ではなく、order byは何の効果もありません.次に、サブクエリを用いて両者を結合してみましょう.並べ替えてグループ化
SELECT
    *
FROM
    (
        SELECT
            barCode,
            priCommodityID,
            createDate
        FROM
            tb_history_version
        WHERE
            barCode = '4565789'
        ORDER BY
            createDate DESC
    ) AS A
GROUP BY
    A.barCode;

結局がっかりした
解決する
上の2つの方法を試してみましたが、結果は悲しいですが、仕事は続けなければなりません.そこでネット上でいろいろな資料を探して、他の方法で問題を解決できるかどうかを見ました.偶然にも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 byorder byを同時に使用しても効果はありません.group_concatgroub byの代わりに使用できます.group_concatでは、フィールドのソートを実行できます.
参考記事
http://www.cnblogs.com/jjcc/p/5896588.html
イニシャルアドレス
http://www.devzxd.top/2017/05/27/mysql-groupby-orderby.html
転載先:https://www.cnblogs.com/devzxd/p/mysql-groupby-orderby.html