最新文章专题视频专题问答1问答10问答100问答1000问答2000关键字专题1关键字专题50关键字专题500关键字专题1500TAG最新视频文章推荐1 推荐3 推荐5 推荐7 推荐9 推荐11 推荐13 推荐15 推荐17 推荐19 推荐21 推荐23 推荐25 推荐27 推荐29 推荐31 推荐33 推荐35 推荐37视频文章20视频文章30视频文章40视频文章50视频文章60 视频文章70视频文章80视频文章90视频文章100视频文章120视频文章140 视频2关键字专题关键字专题tag2tag3文章专题文章专题2文章索引1文章索引2文章索引3文章索引4文章索引5123456789101112131415文章专题3
当前位置: 首页 - 科技 - 知识百科 - 正文

mysql中groupby和orderby同时使用无效的替代方案

来源:动视网 责编:小采 时间:2020-11-09 08:54:18
文档

mysql中groupby和orderby同时使用无效的替代方案

mysql中groupby和orderby同时使用无效的替代方案:前言最近一年由于工作需要大部分使用的都是NoSql数据库,对关系型数据库感觉越来越陌生,一个由group by和order by 引发的血案由此而生。在此做个记录,以备不时之需。需求首先,看一下整体的表结构。现在查找每个barCode中最新的数据。由于数据太多,不是很
推荐度:
导读mysql中groupby和orderby同时使用无效的替代方案:前言最近一年由于工作需要大部分使用的都是NoSql数据库,对关系型数据库感觉越来越陌生,一个由group by和order by 引发的血案由此而生。在此做个记录,以备不时之需。需求首先,看一下整体的表结构。现在查找每个barCode中最新的数据。由于数据太多,不是很


前言

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

需求

首先,看一下整体的表结构。

现在查找每个barCode中最新的数据。

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

SELECTbarCode,
 priCommodityID,
 createDateFROMtb_history_versionWHEREbarCode = '45657'ORDER BYcreateDate DESC;

试错

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

SELECTbarCode,
 priCommodityID,
 createDateFROMtb_history_versionWHEREbarCode = '45657'GROUP BYbarCodeORDER BYcreateDate DESC;

结果如下:

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

SELECT*FROM(SELECTbarCode,
 priCommodityID,
 createDateFROMtb_history_versionWHEREbarCode = '45657'ORDER BYcreateDate DESC) AS AGROUP BYA.barCode;

结果还是令人失望的

解决

上面两种方式试过了,虽然结果让人伤心,但是工作还是要继续。于是就网上找各种资料,看能否用其他方式解决问题。偶然间看到了group_concat可以实现分组排序,就拿来试一试

SELECTbarCode,
 GROUP_CONCAT(
 priCommodityIDORDER BYcreateDate DESC) AS priCommodityID,
 GROUP_CONCAT(
 createDateORDER BYcreateDate DESC) AS createDateFROMtb_history_versionWHEREbarCode = '45657';

结果如下

可以看到顺序没问题了,但是所有数据都被拼接在一起了。需要进一步做截取字符的处理

SELECTbarCode,
 SUBSTRING_INDEX(
 group_concat(
 priCommodityIDORDER BYcreateDate DESC),',',1) AS priCommodityID,
 SUBSTRING_INDEX(
 group_concat(
 createDateORDER BYcreateDate DESC),',',1) AS createDateFROMtb_history_versionWHEREbarCode = '45657'GROUP BYbarCode;


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

总结

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

参考文章

首发地址

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

文档

mysql中groupby和orderby同时使用无效的替代方案

mysql中groupby和orderby同时使用无效的替代方案:前言最近一年由于工作需要大部分使用的都是NoSql数据库,对关系型数据库感觉越来越陌生,一个由group by和order by 引发的血案由此而生。在此做个记录,以备不时之需。需求首先,看一下整体的表结构。现在查找每个barCode中最新的数据。由于数据太多,不是很
推荐度:
  • 热门焦点

最新推荐

猜你喜欢

热门推荐

专题
Top