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

来源:互联网 发布:阿里云 wordpress 编辑:程序博客网 时间:2024/06/08 13:46

前言

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

需求(得到所有barCode的最新的一条数据)

首先,看一下整体的表结构。
表结构
现在查找每个barCode中最新的数据。

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

SELECT    barCode,    priCommodityID,    createDateFROM    tb_history_versionWHERE    barCode = '4565789'ORDER BY    createDate DESC;

示例数据

试错

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

SELECT    barCode,    priCommodityID,    createDateFROM    tb_history_versionWHERE    barCode = '4565789'GROUP BY    barCodeORDER BY    createDate DESC;

结果如下:
错误结果:1
可以看到这并不是我们想要的结果,order by没有任何效果。
接下来就试一下运用子查询的方式将两者结合。先排序再分组

SELECT    *FROM    (        SELECT            barCode,            priCommodityID,            createDate        FROM            tb_history_version        WHERE            barCode = '4565789'        ORDER BY            createDate DESC    ) AS AGROUP 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 createDateFROM    tb_history_versionWHERE    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 createDateFROM    tb_history_versionWHERE    barCode = '4565789'GROUP BY    barCode;

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

总结

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

参考文章

http://www.cnblogs.com/jjcc/p/5896588.html

首发地址

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

原创粉丝点击