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 ...
随机推荐
- OD常用断点之CC断点
在做Windows平台软件逆向时,Ollydbg是极其常用的逆向工具,动态调试功能非常强大.在调试过程中,断点的使用有助于确定关键的破解位置,今天讲解的内容是OD常用断点中的CC断点. CC断点有很多 ...
- [UWP]了解模板化控件(9):UI指南
1. 使用TemplateSettings统一外观 TemplateSettings提供一组只读属性,用于在新建ControlTemplate时使用这些约定的属性. 譬如,修改HeaderedCont ...
- linux下实时监测命令运行结果工具:watch
watch是一个非常实用的工具,可以实时监测一些经常变化的命令结果或文件,而不需要手动一次一次的输入命令. 语法: watch [选项] [命令参数] 选项: -n :指定刷新间隔时间,默认2秒. - ...
- 欲练JS,必先攻CSS——前端修行之路(码易直播)
以下是直播大概内容的文字版: 感谢大家今天来到直播间收听本期的码易直播.今天我讲的主题是css,具体聊一下我大概的css学习历史,分享一些干货,希望这次分享对大家有所启发和帮助. 个人的css历史: ...
- 《快学Scala》——控制结构和函数
条件表达式 在Scala中if/else表达式有值,这个值就是跟在if或else之后的表达式的值.例如: if (x > 0) 1 else -1 上述表达式的值是1或-1,具体是哪一个取决于x ...
- fir.im 持续集成技术实践
互联网时代,人人都在追求产品的快速响应.快速迭代和快速验证.不论是创业团队还是大中型企业,都在探索属于自己的敏捷开发.持续交付之道.fir.im 团队也在全面实施敏捷,并推出新持续集成服务 - flo ...
- DOM4J案例详解(添加 ,查询 ,删除 ,保存)
先看一下XML文档 <?xml version="1.0" encoding="gb2312"?> <exam> <student ...
- Power Pivot表属性无法切换回表预览模式的问题
近期Office365用户升级后解决了在Power Pivot中输入中文的问题,但是同时也带来了一个新的问题就是表属性窗口默认为“查询编辑器”模式,且无法切换回“表预览”模式. 本文和您分享在这种情况 ...
- angular.js的表格指令
html div.col-sm-12 table.table.table-bordered.table-condensed.table-hover.table-striped.dataTable.no ...
- 运维老鸟教你安装centos6.5如何选择安装包
标签:老男孩教育 Centos6.5安装选包原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 .作者信息和本声明.否则将追究法律责任.http://oldboy.blog.51cto.c ...