前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >mysql-查询分组的最新数据

mysql-查询分组的最新数据

原创
作者头像
用户8126523
修改2022-11-10 00:23:41
2.9K0
修改2022-11-10 00:23:41
举报
文章被收录于专栏:code1029

最近遇到查分组后最新数据的需求,整理了三种查询方法:


以下表为例,查每个学生的最新信息

表: student

字段:id, student_id, name, dt, height, weight

id是自增ID,student_id唯一标识一个学生


第一种:

代码语言:txt
复制
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`

第一种方法存在的问题是,如果一个学生在一天有多条记录,一个学生得到的结果就不唯一了。


第二种:

代码语言:txt
复制
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里没有的字段。


第三种:

代码语言:txt
复制
SELECT * FROM (
    SELECT *, row_number() OVER(PARTITION BY `student_id` ORDER BY `dt` DESC) group_idx 
    FROM `student`
)t
WHERE `group_idx` = 1

目前我用的是第三种

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档