mysql中group by和order by同时使用无效的替代方案
前言
最近一年由于工作需要大部分使用的都是NoSql数据库,对关系型数据库感觉越来越陌生,一个由group by和order by 引发的血案由此而生。在此做个记录,以备不时之需。
需求(得到所有barCode的最新的一条数据)
首先,看一下整体的表结构。

现在查找每个barCode中最新的数据。
由于数据太多,不是很好看到效果。我们就拿一个barCode为4565789的数据做示例。
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;
结果如下:

可以看到这并不是我们想要的结果,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;
结果还是令人失望的

解决
上面两种方式试过了,虽然结果让人伤心,但是工作还是要继续。于是就网上找各种资料,看能否用其他方式解决问题。偶然间看到了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 by和order by同时使用是没有效果的,可以使用group_concat和groub by替代。group_concat内可以实现字段排序。
参考文章
http://www.cnblogs.com/jjcc/p/5896588.html
首发地址
http://www.devzxd.top/2017/05/27/mysql-groupby-orderby.html
mysql中group by和order by同时使用无效的替代方案的更多相关文章
- 转:深入研究mysql中group by与order by取分类最新时间内容
鉴于项目的需要,就从网上找到该文章,文章分析得很详细也很易懂,在android里, (不知道是不是现在水平的限制,总之我还没找到在用ContentProvider时可以使用子查询),主要方法是用SQL ...
- 深入研究mysql中group by与order by取分类最新时间内容
鉴于项目的需要,就从网上找到该文章,文章分析得很详细也很易懂,在android里,(不知道是不是现在水平的限制,总之我还没找到在用 ContentProvider时可以使用子查询),主要方法是用SQL ...
- mysql中group by和order by混用 结果不是理想结果(转)
文章转自 https://www.cnblogs.com/myphper/p/3767572.html 在使用mysql排序的时候会想到按照降序分组来获得一组数据,而使用order by往往得到的不是 ...
- mysql中group by和order by混用 结果不是理想结果
在使用mysql排序的时候会想到按照降序分组来获得一组数据,而使用order by往往得到的不是理想中的结果,那么怎么才能使用group by 和order by得到理想中的数据结果呢? 例如 有一个 ...
- MySQL中group by 与 order by 一起使用排序问题
假设有一个表:reward(奖励表),表结构如下: CREATE TABLE test.reward ( id ) NOT NULL AUTO_INCREMENT, uid ) NOT NULL CO ...
- mysql 用 group by 和 order by同时使用
首先,这是不可能实现的 mysql的查询的顺序 select -> from-> where->group by->having->order by. 但mysql的解析 ...
- hive的strict模式;where,group by,having,order by同时使用的执行顺序
主要限制三种情况 (1) 有partition的表查询需要加上where子句,筛选部分数据实现分区裁剪,即不允许全表全分区扫描,防止数据过大 (2) order by 执行时只产生一个reduce,必 ...
- mysql之group by,order by
写在前面 上篇文章介绍mysql的增删改查操作,这篇将介绍group和order by操作. 系列文章 mysql之创建数据库,创建数据表 mysql之select,insert,delete,upd ...
- MySQL中group by , sum , case when then 的使用
在我们使用数据库的时候,可能会遇到需要进行统计的情况. 比如需要统计一下,下表中各个年份的胜负场数. 遇到这样的情况,我们应该怎么办呢? 在mysql中我们可以使用group by sum case ...
随机推荐
- PLSQL 配置设置
1.登录后默认自动选中MyObjects 默认情况下,PLSQLDeveloper登录后,Brower里会选择Allobjects,如果你登录的用户是dba,要展开tables目录,正常情况都需要Wa ...
- javascript 函数和作用域(函数,this)(六)
重点. 一.函数 1.函数介绍 函数是一块JavaScript代码,被定义一次,但可执行和调用多次.JS中的函数也是对象,所以JS函数可以像其他对象那样操作和传递,所以我们也常叫JS中的函数为函数对象 ...
- [刷题]算法竞赛入门经典(第2版) 5-12/UVa511 - Do You Know the Way to San Jose?
题意:N张地图,查找某地点在不在某些地图上,若在,使用细节多的地图.使用哪个地图的破要求挺多,细心一点就好. 代码:(Accepted,0.000s) //UVa511 - Do You Know t ...
- 如何在WebGL全景图上做标记
WebGL可以用来做3D效果的全景图呈现,例如故宫的全景图.但有时候我们不仅仅只是呈现全景图,还需要增加互动.故宫里边可以又分了很多区域,例如外朝中路.外朝西路.外朝东路等等.我们需要在3D图上做一些 ...
- 调试 Dockerfile - 每天5分钟玩转 Docker 容器技术(15)
包括 Dockerfile 在内的任何脚本和程序都会出错.有错并不可怕,但必须有办法排查,所以本节讨论如何 debug Dockerfile. 先回顾一下通过 Dockerfile 构建镜像的过程: ...
- ConcurrentSkipListMap深入分析
1.前言 ConcurrentHashMap与ConcurrentSkipListMap性能测试 在4线程1.6万数据的条件下,ConcurrentHashMap 存取速度是ConcurrentSki ...
- NIO Socket编程实例
1.阻塞模式实例 NIOUtil类,用来通过SOcket获取BufferedReader和PrintWriter. package IO; import java.io.BufferedReader; ...
- HotSpot的算法实现
1.枚举根节点 可达性分析中从GC Roots节点找引用,可作为GC Roots的节点主要是全局性的引用与执行上下文中,如果要逐个检查引用,必然消耗时间.另外可达性分析对执行时间的敏感还体现在GC停顿 ...
- 【方法】Html5实现文件异步上传
1 简介 开发文件上传功能从来不是一件愉快的事,异步上传更是如此,使用过iframe和Flash的上传方案,也都感觉十分的别扭.本文简要简绍利用Html5的FormData实现文件的异步上传,还可以实 ...
- 使用cmd来起一个服务器
第一步:安装Node.js 下载地址:https://nodejs.org/en/ 第二步:打开cmd,输入node -v 确认是否安装成功,成功后显示版本号如下: 第三步:输入命令:ndoe ins ...