最近遇到查分组后最新数据的需求,整理了三种查询方法:
以下表为例,查每个学生的最新信息
表: 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
目前我用的是第三种
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。