zl程序教程

您现在的位置是:首页 >  数据库

当前栏目

mysql-查询分组的最新数据

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

目前我用的是第三种