mysql-查询分组的最新数据
2023-06-13 09:14:53 时间
最近遇到查分组后最新数据的需求,整理了三种查询方法:
以下表为例,查每个学生的最新信息
表: student
字段:id, student_id, name, dt, height, weight
id是自增ID,student_id唯一标识一个学生
第一种:
SELECT t2.* FROM
(
SELECT `student_id`,max(dt) AS dt FROM `student`
GROUP BY `student_id`
)t1
INNER JOIN `student` t2
ON t1.`student_id`=t2.`student_id` AND t1.`dt` = t2.`dt`
第一种方法存在的问题是,如果一个学生在一天有多条记录,一个学生得到的结果就不唯一了。
第二种:
SELECT t.* FROM(
SELECT * FROM `student` ORDER BY `dt` DESC LIMIT 1000
) t
GROUP BY t.`student_id`
第二种方法存在的问题是,如果数据库是默认的严格模式,sql_mode="ONLY_FULL_GROUP_BY",这个sql会报以下错误:
1055 - Expression #1 of SELECT list is not in GROUP BY clause and contains nonaggregated column 't.id' which is not functionally dependent on columns in GROUP BY clause; this is incompatible with sql_mode=only_full_group_by
就是group by的字段在select里有,当然也可以通过聚合,在select里加上group by里没有的字段。
第三种:
SELECT * FROM (
SELECT *, row_number() OVER(PARTITION BY `student_id` ORDER BY `dt` DESC) group_idx
FROM `student`
)t
WHERE `group_idx` = 1
目前我用的是第三种
相关文章
- 查询MySQL遍历查询:精彩体验。(mysql遍历)
- MySQL查询当前小时时间(mysql获取当前小时)
- 查询MySQL中Like查询的精彩绝伦(mysql的like)
- MySQL内外连接技巧:实现数据最佳性能(mysql内连接外连接)
- MySQL 数据导出权限设置指南(mysql导出数据权限)
- 简易指南:如何在终端连接MySQL数据库(终端连接mysql数据库)
- 数据MySQL中插入中文数据的操作方法(mysql中插入中文)
- MySQL非阻塞式访问:提升性能和效率(mysql非阻塞)
- 从MySQL中获取重复数据的方法(mysql取重复数据)
- MySQL:数据驱动的路径(mysql引号)
- MySQL查询:按日期搜索结果(mysql按日期查询)
- MySQL 服务器登录指南(登录mysql服务器)
- 用Hive实现MySQL数据快速导入(hive数据导入mysql)
- MySQL数据库:掌握操作指令的必备法宝(mysql数据库操作命令)
- 记录MySQL实现的查询上一条记录的技巧(mysql查询上一条)
- MySQL如何使用XML序列化数据(mysql xml序列化)
- MySQL的两种排序算法快速排序和归并排序(mysql两种排序算法)
- 找出MySQL数据库中两个数字的最大值(mysql 两数字最大值)
- MySQL不支持bit类型数据(mysql 不支持bit)