前言

最近一年由于工作需要大部分使用的都是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;

结果如下:



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

mysql中group by和order by同时使用无效的替代方案的更多相关文章

  1. 转:深入研究mysql中group by与order by取分类最新时间内容

    鉴于项目的需要,就从网上找到该文章,文章分析得很详细也很易懂,在android里, (不知道是不是现在水平的限制,总之我还没找到在用ContentProvider时可以使用子查询),主要方法是用SQL ...

  2. 深入研究mysql中group by与order by取分类最新时间内容

    鉴于项目的需要,就从网上找到该文章,文章分析得很详细也很易懂,在android里,(不知道是不是现在水平的限制,总之我还没找到在用 ContentProvider时可以使用子查询),主要方法是用SQL ...

  3. mysql中group by和order by混用 结果不是理想结果(转)

    文章转自 https://www.cnblogs.com/myphper/p/3767572.html 在使用mysql排序的时候会想到按照降序分组来获得一组数据,而使用order by往往得到的不是 ...

  4. mysql中group by和order by混用 结果不是理想结果

    在使用mysql排序的时候会想到按照降序分组来获得一组数据,而使用order by往往得到的不是理想中的结果,那么怎么才能使用group by 和order by得到理想中的数据结果呢? 例如 有一个 ...

  5. MySQL中group by 与 order by 一起使用排序问题

    假设有一个表:reward(奖励表),表结构如下: CREATE TABLE test.reward ( id ) NOT NULL AUTO_INCREMENT, uid ) NOT NULL CO ...

  6. mysql 用 group by 和 order by同时使用

    首先,这是不可能实现的 mysql的查询的顺序 select -> from-> where->group by->having->order by. 但mysql的解析 ...

  7. hive的strict模式;where,group by,having,order by同时使用的执行顺序

    主要限制三种情况 (1) 有partition的表查询需要加上where子句,筛选部分数据实现分区裁剪,即不允许全表全分区扫描,防止数据过大 (2) order by 执行时只产生一个reduce,必 ...

  8. mysql之group by,order by

    写在前面 上篇文章介绍mysql的增删改查操作,这篇将介绍group和order by操作. 系列文章 mysql之创建数据库,创建数据表 mysql之select,insert,delete,upd ...

  9. MySQL中group by , sum , case when then 的使用

    在我们使用数据库的时候,可能会遇到需要进行统计的情况. 比如需要统计一下,下表中各个年份的胜负场数. 遇到这样的情况,我们应该怎么办呢? 在mysql中我们可以使用group by sum  case ...

随机推荐

  1. myeclipse/eclipse 配置SSM框架错误之一解决方法

    报错如下: 1. [org.springframework.web.context.ContextLoader] - Root WebApplicationContext: initializatio ...

  2. 利用GROUP_CONCAT和GROUP BY实现字段拼接

    在开发过程中遇到这样的一个需求,通过GROUP BY分组归类后将同属性的字段进行拼接. 表结构为: id value a b c a b 需要得到结果: id value a,b,c a,b 一开始在 ...

  3. java中的GC(gabage collection)如何工作

    1. “引用记数(reference counting)”是一种简单但速度很慢的垃圾回收技术.每个对象都含有一个引用记数器,当有引用连接至对象时,引用计数加1.当引用离开作用域或被置 为null时,引 ...

  4. hdu2717Catch That Cow 简单BFS

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2717 刚开始思路错了,用的DP,一直WA,后来才发现是搜索,还是简单的BFS,顿时.... 思路: B ...

  5. 华硕 F1A55-M LX3系列跳线图

    天啊,第一次遇到这么变态的主板跳线...浪费我好久时间找到这跳线图

  6. PLSQL 保存布局

    PLSQL 设置好布局,退出重新登录后,页面布局又恢复原样,所以需要我们保存下我们布局 打开window-->Save layout,保存布局,下次登录布局就是你原来的布局了

  7. [转]shell awk 入门,中级,高级使用

    awk很常用,对于我们在shell中分析log和file很有好处,很实用的东西,大家一起分享学习- 作为技术支持工程师,我们最最经常的工作就是要处理文本文件,不管是什么数据库最后都可以导成文本,我们就 ...

  8. Angular2 关于*ngFor 嵌套循环

    在项目开发中拿到的数据是这样的,要循环遍历出来.可是在ng2中好像不能直接遍历Object datas: any = [ { num: 1, date: "2017-04-12", ...

  9. chrome的断点调试

    DOM节点变化时触发断点具体触发条件可分3种情况:子节点有变化.节点的属性发生变化或这个节点被删除.可以快速找到对应的事件处理函数. 条件断点 写一个表达式,表达式为 true 时才触发该断点. 在D ...

  10. 关于html表格单元格宽度的计算规则

    * { margin: 0; padding: 0 } body { background: #fafafa } ul,li { list-style: none } h1 { margin: 20p ...