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


    前言

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

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

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

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

    SELECT
    	barCode,
    	priCommodityID,
    	createDate
    FROM
    	tb_history_version
    WHERE
    	barCode = '4565789'
    ORDER BY
    	createDate DESC;
    

    示例数据

    试错

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

    SELECT
    	barCode,
    	priCommodityID,
    	createDate
    FROM
    	tb_history_version
    WHERE
    	barCode = '4565789'
    GROUP BY
    	barCode
    ORDER BY
    	createDate DESC;
    

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

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

  • 相关阅读:
    ubuntu :安装skype聊天工具
    ubuntu :安装一个方便的终端工具,Guake Terminal
    ubuntu :安装好了搜狗输入法但是没法用
    Qt学习笔记(1) hello world
    Sublime + python2.7 + opencv (轻量级开发环境)
    Clion + opencv环境搭建(体验最好的C++ IDE)
    最快入门程序员
    isinstance,issubclass
    类的封装,property特性,类与对象的绑定方法和非绑定方法,
    类的继承,派生,组合,菱形继承问题,类的多态和多态性
  • 原文地址:https://www.cnblogs.com/devzxd/p/mysql-groupby-orderby.html
Copyright © 2020-2023  润新知