问题

如何把数据按照某一个字段排重保留我们要的哪行记录,然后以我们想要的顺序排序好以后,查询出来?

今天花了一整天的时间搞这个问题,本来以为是很简单的问题就小瞧它了,结果发现网上一大堆错误答案,我也是醉了。。

文章略长,主要讲述的是我的探索(踩坑)过程,想要直接看解决方法的请拉到最后,拿走不谢~

过程

先说一下问题所在,比如说,现在有一个表,体温测量。结构如下:

假设我们每隔一段时间去给用户测量一次体温,那么同一个用户就会产生多条记录。现在我们想要查询出每一个用户最新一条测量数据,怎么查?

接下来我说说我的踩坑历程:

是不是觉得很简单,先分组,把重复的数据排掉:

select * from tplay_temperature_record group by user_id;

查询结果:

我去,不对啊,我想要的是最新的一条,id为51的那条数据才是我想要的啊,怎么给我返回了id为50的?不行,看来我得先排好序,再进行排重,(这个时候我以为group by拿的是第一条):

第一步,先排序:

select * from tplay_temperature_record order by create_time desc;

看到结果,已经排好序了。

然后我们用到子查询去进行分组:

select * from (select * from tplay_temperature_record order by create_time) as a group by a.user_id;

结果:

我去,不对啊,id为51的那条,咋又给我整没了。

发现有人这样说:

卧槽,这样子的吗?原谅我年少无知,才疏学浅,那么我们试试,加上limit:

select * from (select * from tplay_temperature_record order by create_time limit 100) as a group by a.user_id;

结果:

还是一样,没有任何改变,我不知道是不是mysql版本太低的原因,我用的是5.5.62,反正就是没效果。

再看看其他大神的思路吧

这篇文章的核心思想是:先分组,再排序。

对啊,我们想的是先排序再分组,如果反过来呢?

文章里说到:

按照他说的,写一个:

SELECT * FROM (select * from tplay_temperature_record order by user_id, create_time DESC) bGROUP BY b.user_id;

结果:

啥情况,还是不对?接着往下翻,看到底下评论一堆叫苦连天的。。

好吧,看来广大网友和我一样,没从这篇文章中获得什么~

解决

喜闻乐见的环节来了,在无数次的挣扎之后,终于获得了正确的方法,也是参考了下面这篇文章,感谢大神!

核心思想,两个表的思想,就是先分组作为另一个表,然后进行子查询,用user_id去关联,对结果进行排序。

上步骤:

第一步,分组,排除重复,保留想要的哪一行记录。这里我们是按照user_id排重,查询时间最近的那条,就可以这样写:

SELECT

user_id,max(create_time) max_day,

temperatureFROMtplay_temperature_recordGROUP BY

user_id

第二步,子查询,把上述的查询结果当成另一个表B,然后原表当成表A,用user_id去关联,然后对查询到的结果进行排序。

SELECTA.*

FROMtplay_temperature_record A,

(SELECT

user_id,max(create_time) max_day,

temperatureFROMtplay_temperature_recordGROUP BY

user_id) BWHEREA.user_id = B.user_id

AND A.create_time =B.max_dayORDER BYA.create_timeDESC

结果:

完美!

总结一下,这一类问题,看似简单,其实复杂。

我自己感觉这个问题有两个难点:

1、group by分组后如何保留自己想要的那一行数据?搭配聚合方法,或许有奇效

2、分组后的数据如何排序?其实不太好排序,为何不变通一下,分成两个表,然后关联一下查询再排序呢?

除了这种方法,肯定有其他的,如果有其他方法的,希望在评论区大家一起讨论下。

---------------------------------------------------------------------------------------------------------------------------------------

不好意思,找到一个更简单的写法:

SELECT

*,max(create_time) max_dayFROMtplay_temperature_recordGROUP BY

user_id

ORDER BYmax_dayDESC

都不需要用到“两个表”的思想。

mysql排重_mysql探索(一) 关于排重+排序的处理相关推荐

  1. mysql null 排前面_Mysql实现null值排在最前/最后的方法示例

    前言 我们已经知道 MySQL 使用 SQL SELECT 命令及 WHERE 子句来读取数据表中的数据,但是当提供的查询条件字段为 NULL 时,该命令可能就无法正常工作. 为了处理这种情况,MyS ...

  2. mysql 插入前查重_Mysql插入数据前查重

    常见插入数据的SQL insert into 插入数据库时会检查主键是否存在,存在会报错 replace into 替换数据库记录,需要表中有主键或者unique索引,如果数据库已存在的数据,会先删除 ...

  3. mysql探活_MYSQL探索

    concat select * from where concat(字段1,字段2,...)   = 'e1234234'; 查询几个字段拼接起来是e1234234的数据, concat(字段1,字段 ...

  4. mysql mongodb 事务_MySQL PK MongoDB:多文档事务支持,谁更友好?

    原标题:MySQL PK MongoDB:多文档事务支持,谁更友好? 作者介绍 贺春旸,凡普金科DBA团队负责人,<MySQL管理之道:性能调优.高可用与监控>第一.二版作者,曾任职于中国 ...

  5. mysql 降序_MySQL 8 新特性之降序索引底层实现

    什么是降序索引 大家可能对索引比较熟悉,而对降序索引比较陌生,事实上降序索引是索引的子集. 我们通常使用下面的语句来创建一个索引: create index idx_t1_bcd on t1(b,c, ...

  6. 动态排程才是生产计划排程的根本

    动态排程与排程试算,许多人将这两者混为一谈,甚至许多APS软件也用排程试算等于动态排程的思想进行宣传,其实这两者有着本质的区别. 排程试算是反复进行重新排程试计算,是在各种不同条件下的预排程,是提前进 ...

  7. 三路快排算法加强版(三路快排的再次改进)

    :不要忘记初心哈 :) 理论依据 快排算法的缺陷及其逐一改进 三路快排尽可能三等份划分区间 通过待排元素的区间长度划分? 通过待排元素的最值之差划分? 直接使用待排元素的最大值划分? 实验数据 大范围 ...

  8. mysql ibata文件_重装系统后,怎么调用之前mysql的数据_mysql

    重装系统后,如何调用之前mysql的数据 前提是:必须保留之前的数据库数据 在介绍此方法之前,提醒各位最好的转移数据的方法为: 在原来MYSQL服务器导出SQL文件,然后再在新的MYSQL服务器导入数 ...

  9. 如何让生产计划动态排程?秘诀在于生产排程管理系统

    在许多生产管理者眼中,生产作业计划是不重要的,如果我们只停留在小加工作坊的规模,大脑就能把一个月的订单.物料.资源记得清清楚楚,那么生产计划排程的必要性确实不太大,但事实上,随着生产规模的扩大,人脑已 ...

最新文章

  1. 【cropper】限制图片大小
  2. java 短链接实现方案_java利用百度短网址api实现URL长短互换工具类分享
  3. SQL逗号分隔的字段统计(摘自网络)
  4. 当Java代码遇上抽象、重载加重写,一切都不美好了
  5. Linux 文件与目录管理,玩转文件和目录管理的相关命令
  6. 实数集r用区间表示为_七大实数理论与互推
  7. pil python 安装_Python实现识别人脸特征并打印出来!
  8. Output Arcade for Mac - 新型音频合成器
  9. 近几年热门的计算机专业,中国近十年最受高考状元青睐专业排行榜
  10. Flex TLF 相关知识
  11. 分享几个程序员接活赚外快的平台
  12. 阿里云的应用(day02)
  13. chrome浏览器上传文件延迟_谷歌Chrome上传文件未响应的解决办法
  14. FPGA基础(数字电路)
  15. 斐波拉契数列(简单思路)
  16. DNS Round Robin
  17. 华为mate50鸿蒙,华为Mate50概念图:棱形摄像头+鸿蒙OS,依靠备胎计划还能否翻身...
  18. uniapp图片不显示 - 变量动态修改图片地址不生效 - 图片src路径错误
  19. TP简约自适应导航网站源码
  20. 基于JavaScript的电梯调度设计

热门文章

  1. 制作优品新手指南页面
  2. 当成为全球第二大汽车出口国后,中国车企的下一步是什么?
  3. 进制转换(Q进制转换成T进制)详解版
  4. 生猪价格四个月跌26% 养猪产业链告急
  5. 密码MD5加盐加密----注册、校验、修改模块
  6. react跑马灯插件react-slick使用
  7. 读-Martin Fowler-企业应用架构模式
  8. 我给小区物业写了个车牌自动识别系统,非常实用。物业给你免费停车一年!
  9. USB接口Ntag 213/215/216系列读卡器发卡器 Ntag标签读写器发卡器 NFC标签读卡器 ISO14443读卡器 TypeA标签发卡器
  10. Zephry传感器模型介绍和bme240测试