mysql排重_mysql探索(一) 关于排重+排序的处理
问题
如何把数据按照某一个字段排重保留我们要的哪行记录,然后以我们想要的顺序排序好以后,查询出来?
今天花了一整天的时间搞这个问题,本来以为是很简单的问题就小瞧它了,结果发现网上一大堆错误答案,我也是醉了。。
文章略长,主要讲述的是我的探索(踩坑)过程,想要直接看解决方法的请拉到最后,拿走不谢~
过程
先说一下问题所在,比如说,现在有一个表,体温测量。结构如下:
假设我们每隔一段时间去给用户测量一次体温,那么同一个用户就会产生多条记录。现在我们想要查询出每一个用户最新一条测量数据,怎么查?
接下来我说说我的踩坑历程:
是不是觉得很简单,先分组,把重复的数据排掉:
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探索(一) 关于排重+排序的处理相关推荐
- mysql null 排前面_Mysql实现null值排在最前/最后的方法示例
前言 我们已经知道 MySQL 使用 SQL SELECT 命令及 WHERE 子句来读取数据表中的数据,但是当提供的查询条件字段为 NULL 时,该命令可能就无法正常工作. 为了处理这种情况,MyS ...
- mysql 插入前查重_Mysql插入数据前查重
常见插入数据的SQL insert into 插入数据库时会检查主键是否存在,存在会报错 replace into 替换数据库记录,需要表中有主键或者unique索引,如果数据库已存在的数据,会先删除 ...
- mysql探活_MYSQL探索
concat select * from where concat(字段1,字段2,...) = 'e1234234'; 查询几个字段拼接起来是e1234234的数据, concat(字段1,字段 ...
- mysql mongodb 事务_MySQL PK MongoDB:多文档事务支持,谁更友好?
原标题:MySQL PK MongoDB:多文档事务支持,谁更友好? 作者介绍 贺春旸,凡普金科DBA团队负责人,<MySQL管理之道:性能调优.高可用与监控>第一.二版作者,曾任职于中国 ...
- mysql 降序_MySQL 8 新特性之降序索引底层实现
什么是降序索引 大家可能对索引比较熟悉,而对降序索引比较陌生,事实上降序索引是索引的子集. 我们通常使用下面的语句来创建一个索引: create index idx_t1_bcd on t1(b,c, ...
- 动态排程才是生产计划排程的根本
动态排程与排程试算,许多人将这两者混为一谈,甚至许多APS软件也用排程试算等于动态排程的思想进行宣传,其实这两者有着本质的区别. 排程试算是反复进行重新排程试计算,是在各种不同条件下的预排程,是提前进 ...
- 三路快排算法加强版(三路快排的再次改进)
:不要忘记初心哈 :) 理论依据 快排算法的缺陷及其逐一改进 三路快排尽可能三等份划分区间 通过待排元素的区间长度划分? 通过待排元素的最值之差划分? 直接使用待排元素的最大值划分? 实验数据 大范围 ...
- mysql ibata文件_重装系统后,怎么调用之前mysql的数据_mysql
重装系统后,如何调用之前mysql的数据 前提是:必须保留之前的数据库数据 在介绍此方法之前,提醒各位最好的转移数据的方法为: 在原来MYSQL服务器导出SQL文件,然后再在新的MYSQL服务器导入数 ...
- 如何让生产计划动态排程?秘诀在于生产排程管理系统
在许多生产管理者眼中,生产作业计划是不重要的,如果我们只停留在小加工作坊的规模,大脑就能把一个月的订单.物料.资源记得清清楚楚,那么生产计划排程的必要性确实不太大,但事实上,随着生产规模的扩大,人脑已 ...
最新文章
- 【cropper】限制图片大小
- java 短链接实现方案_java利用百度短网址api实现URL长短互换工具类分享
- SQL逗号分隔的字段统计(摘自网络)
- 当Java代码遇上抽象、重载加重写,一切都不美好了
- Linux 文件与目录管理,玩转文件和目录管理的相关命令
- 实数集r用区间表示为_七大实数理论与互推
- pil python 安装_Python实现识别人脸特征并打印出来!
- Output Arcade for Mac - 新型音频合成器
- 近几年热门的计算机专业,中国近十年最受高考状元青睐专业排行榜
- Flex TLF 相关知识
- 分享几个程序员接活赚外快的平台
- 阿里云的应用(day02)
- chrome浏览器上传文件延迟_谷歌Chrome上传文件未响应的解决办法
- FPGA基础(数字电路)
- 斐波拉契数列(简单思路)
- DNS Round Robin
- 华为mate50鸿蒙,华为Mate50概念图:棱形摄像头+鸿蒙OS,依靠备胎计划还能否翻身...
- uniapp图片不显示 - 变量动态修改图片地址不生效 - 图片src路径错误
- TP简约自适应导航网站源码
- 基于JavaScript的电梯调度设计