ホームページ  >  記事  >  データベース  >  mysql で group by と order by を同時に使用するための無効な代替手段

mysql で group by と order by を同時に使用するための無効な代替手段

巴扎黑
巴扎黑オリジナル
2017-06-23 11:10:123234ブラウズ

前書き

ここ 1 年、仕事の都合上、主に NoSql データベースを使用していましたが、リレーショナル データベースにはますます慣れていないように感じています。1 つは group byorder で構成されています。 by これが殺人事件につながった。緊急時のためにここにメモしておきます。 group byorder by 引发的血案由此而生。在此做个记录,以备不时之需。

需求

首先,看一下整体的mysql で group by と order by を同時に使用するための無効な代替手段。
mysql で group by と order by を同時に使用するための無効な代替手段
现在查找每个barCode中最新的数据。

由于数据太多,不是很好看到效果。我们就拿一个barCode4565789的数据做示例。

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

mysql で group by と order by を同時に使用するための無効な代替手段

试错

由于很久没有写过sql了。所以首先想到了用 group by和order by组合查询。

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

结果如下:
mysql で group by と order by を同時に使用するための無効な代替手段
可以看到这并不是我们想要的结果,order by没有任何效果。
接下来就试一下运用子查询的方式将两者结合。先排序再分组

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

结果还是令人失望的
mysql で group by と order by を同時に使用するための無効な代替手段

解决

上面两种方式试过了,虽然结果让人伤心,但是工作还是要继续。于是就网上找各种资料,看能否用其他方式解决问题。偶然间看到了group_concat可以实现分组排序,就拿来试一试

SELECTbarCode,
    GROUP_CONCAT(
        priCommodityIDORDER BYcreateDate DESC) AS priCommodityID,
    GROUP_CONCAT(
        createDateORDER BYcreateDate DESC) AS createDateFROMtb_history_versionWHEREbarCode = '4565789';

结果如下
mysql で group by と order by を同時に使用するための無効な代替手段
可以看到顺序没问题了,但是所有数据都被拼接在一起了。需要进一步做截取字符的处理

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;

mysql で group by と order by を同時に使用するための無効な代替手段
ok!到这里就发现已经实现我们刚开始的需求了。

总结

group byorder by同时使用是没有效果的,可以使用group_concatgroub by替代。group_concat

要件

まず、テーブル全体の構造を見てください。

mysql で group by と order by を同時に使用するための無効な代替手段
barCode /コード>最新データです。

データが多すぎるため、効果はあまり良くありません。例として、barCode4565789 であるデータを見てみましょう。

rrreee

例データ」/></p>🎜試行錯誤🎜🎜長い間SQLを書いていなかったため。そこで、最初に group by と order by の組み合わせクエリを使用することを考えました。 🎜<div class=rrreee🎜結果は次のとおりです: 🎜エラー結果: 1🎜これは私たちが望む結果ではないことがわかります。order by は効果がありません。 🎜次に、サブクエリを使用して 2 つを結合してみましょう。最初に並べ替えてからグループ化します🎜

rrreee
🎜結果は依然として期待外れです🎜エラー結果: 2🎜🎜解決策🎜🎜上記の 2 つの方法を試しました。結果は残念ですが、作業は続けなければなりません。そこで、他の方法で問題を解決できないかネットでさまざまな情報を検索しました。 group_concat でグループソートが実現できると偶然見かけたので試してみました🎜
rrreee
🎜結果は以下の通りです🎜結果 1🎜 順序は問題ありませんが、すべてのデータが結合されていることがわかります。一緒に。文字インターセプトのさらなる処理が必要です🎜
rrreee
🎜mysql で group by と order by を同時に使用するための無効な代替手段🎜OK!この時点で、最初のニーズが達成されたことがわかります。 🎜🎜概要🎜🎜 group byorder by を同時に使用しても効果はありません。 group_concatgroub by は使用できます。 代替。フィールドの並べ替えは group_concat で実装できます。 🎜🎜参考記事🎜🎜🎜🎜🎜初期アドレス🎜🎜http://www.devzxd.top/2017/05/27/mysql-groupby-orderby.html🎜

以上がmysql で group by と order by を同時に使用するための無効な代替手段の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。