ここ 1 年、仕事の都合上、主に NoSql データベースを使用していましたが、リレーショナル データベースにはますます慣れていないように感じています。1 つは group by
と order で構成されています。 by
これが殺人事件につながった。緊急時のためにここにメモしておきます。 group by
和order by
引发的血案由此而生。在此做个记录,以备不时之需。
首先,看一下整体的mysql で group by と order by を同時に使用するための無効な代替手段。
现在查找每个barCode
中最新的数据。
由于数据太多,不是很好看到效果。我们就拿一个barCode
为4565789
的数据做示例。
SELECTbarCode, priCommodityID, createDateFROMtb_history_versionWHEREbarCode = '4565789'ORDER BYcreateDate DESC;
由于很久没有写过sql了。所以首先想到了用 group by和order by组合查询。
SELECTbarCode, priCommodityID, createDateFROMtb_history_versionWHEREbarCode = '4565789'GROUP BYbarCodeORDER BYcreateDate DESC;
结果如下:
可以看到这并不是我们想要的结果,order by
没有任何效果。
接下来就试一下运用子查询的方式将两者结合。先排序再分组
SELECT*FROM(SELECTbarCode, priCommodityID, createDateFROMtb_history_versionWHEREbarCode = '4565789'ORDER BYcreateDate DESC) AS AGROUP BYA.barCode;
结果还是令人失望的
上面两种方式试过了,虽然结果让人伤心,但是工作还是要继续。于是就网上找各种资料,看能否用其他方式解决问题。偶然间看到了group_concat
可以实现分组排序,就拿来试一试
SELECTbarCode, GROUP_CONCAT( priCommodityIDORDER BYcreateDate DESC) AS priCommodityID, GROUP_CONCAT( createDateORDER BYcreateDate DESC) AS createDateFROMtb_history_versionWHEREbarCode = '4565789';
结果如下
可以看到顺序没问题了,但是所有数据都被拼接在一起了。需要进一步做截取字符的处理
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;
ok!到这里就发现已经实现我们刚开始的需求了。
group by
和order by
同时使用是没有效果的,可以使用group_concat
和groub by
替代。group_concat
各 barCode /コード>最新データです。
barCode
が 4565789
であるデータを見てみましょう。 rrreee🎜結果は次のとおりです: 🎜🎜これは私たちが望む結果ではないことがわかります。order by
は効果がありません。 🎜次に、サブクエリを使用して 2 つを結合してみましょう。最初に並べ替えてからグループ化します🎜
group_concat
でグループソートが実現できると偶然見かけたので試してみました🎜group by
と order by
を同時に使用しても効果はありません。 group_concat
と groub by は使用できます。
代替。フィールドの並べ替えは group_concat
で実装できます。 🎜🎜参考記事🎜🎜🎜🎜🎜初期アドレス🎜🎜http://www.devzxd.top/2017/05/27/mysql-groupby-orderby.html🎜以上がmysql で group by と order by を同時に使用するための無効な代替手段の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。