前言
最近一年由于工作需要大部分使用的都是nosql数据库,对关系型数据库感觉越来越陌生,一个由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;
登录后复制
总结
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同时使用无效的替代方案的详细内容,更多请关注【创想鸟】其它相关文章!
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至253000106@qq.com举报,一经查实,本站将立刻删除。
发布者:PHP中文网,转转请注明出处:https://www.chuangxiangniao.com/p/1620014.html