mysql group by 替代_mysql中group by和order by同时使用无效的替代方案

当需要在MySQL中按分组获取每组第一条(或最后一条)记录时,直接使用GROUP BY和ORDER BY无法达到预期效果。本文介绍了通过GROUP_CONCAT先排序再进行分组的方法,解决这一问题。通过示例展示了如何利用GROUP_CONCAT配合SUBSTRING_INDEX获取每个barCode的最新数据。
摘要由CSDN通过智能技术生成

前言

最近一年由于工作需要大部分使用的都是NoSql数据库,对关系型数据库感觉越来越陌生,一个由group by和order by 引发的血案由此而生。在此做个记录,以备不时之需。

需求

首先,看一下整体的表结构。

5c4552aa5355db81cdf97176217da9a1.png

现在查找每个barCode中最新的数据。

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

SELECTbarCode,

priCommodityID,

createDateFROMtb_history_versionWHEREbarCode = '4565789'ORDER BYcreateDate DESC;

97cba131e4c21633582082cbf432e12d.png

试错

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

SELECTbarCode,

priCommodityID,

createDateFROMtb_history_versionWHEREbarCode = '4565789'GROUP BYbarCodeORDER BYcreateDate DESC;

结果如下:

eb6e22baeae3d8459000038e1375c12c.png

可以看到这并不是我们想要的结果,order by没有任何效果。

接下来就试一下运用子查询的方式将两者结合。先排序再分组

SELECT*FROM(SELECTbarCode,

priCommodityID,

createDateFROMtb_history_versionWHEREbarCode = '4565789'ORDER BYcreateDate DESC) AS AGROUP BYA.barCode;

结果还是令人失望的

c9a929c43b3fd2c998f49ff57cd6fbd0.png

解决

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

SELECTbarCode,

GROUP_CONCAT(

priCommodityIDORDER BYcreateDate DESC) AS priCommodityID,

GROUP_CONCAT(

createDateORDER BYcreateDate DESC) AS createDateFROMtb_history_versionWHEREbarCode = '4565789';

结果如下

bf60d0ab6de53df54297c3cba40eba24.png

可以看到顺序没问题了,但是所有数据都被拼接在一起了。需要进一步做截取字符的处理

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;

c9d1d735fb9ea5db6a609555ef3f8889.png

ok!到这里就发现已经实现我们刚开始的需求了。

总结

group by和order by同时使用是没有效果的,可以使用group_concat和groub by替代。group_concat内可以实现字段排序。

参考文章

首发地址

http://www.devzxd.top/2017/05/27/mysql-groupby-orderby.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值