mysqlでgroupbyとorder byが無効な代替案を同時に使用
2733 ワード
前言
最近の1年は仕事のため大部分がNoSqlデータベースを使う必要があるため、関係型データベースに対してますますよく知らない感じがして、1つの
需要(barCodeの最新データをすべて取得)
まず、全体の表構造を見てみましょう.各
データが多すぎて、効果がよく見えません.
試行錯誤
久しぶりにsqlを書いたので.そこでまずgroup byとorder byを組み合わせてクエリーを考えました.
結果は以下の通りです.これは私たちが望んでいる結果ではなく、
結局がっかりした
解決する
上の2つの方法を試してみましたが、結果は悲しいですが、仕事は続けなければなりません.そこでネット上でいろいろな資料を探して、他の方法で問題を解決できるかどうかを見ました.偶然にも
結果は以下のように順序は問題ありませんが、すべてのデータがつなぎ合わせられています.さらに文字を切り取る処理が必要です
ok!ここまで来ると、私たちの最初のニーズが実現されていることがわかります.
まとめ
参考記事
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
最近の1年は仕事のため大部分がNoSqlデータベースを使う必要があるため、関係型データベースに対してますますよく知らない感じがして、1つの
group by
とorder by
によって引き起こされた血の事件はここから生まれました.ここに記録を作って、時々の必要に備えます.需要(barCodeの最新データをすべて取得)
まず、全体の表構造を見てみましょう.各
barCode
の最新データを検索します.データが多すぎて、効果がよく見えません.
barCode
が4565789
であるデータを例に挙げます.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 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
転載先:https://www.cnblogs.com/devzxd/p/mysql-groupby-orderby.html