目录
[1、MySQL 5版本的写法](#1、MySQL 5版本的写法)
[2、MySQL 8版本的写法](#2、MySQL 8版本的写法)
由于MySQL 5不支持窗口函数,因此不能使用PARTITION()、ROW_NUMBER()
🌰:获取每个班级中最新注册的学号人员信息
也就是从 user_info 学生表中获取每个 class_id 班级的最新一条记录
1、MySQL 5版本的写法
🔴写法1:
sql
SELECT u.user_id, u.class_id, u.user_name, u.time
FROM (
SELECT class_id, MAX(time) AS max_time
FROM user_info
GROUP BY class_id
) AS latest
JOIN user_info u ON u.class_id = latest.class_id AND u.time = latest.max_time;
释意:
1、子查询:
- 子查询从 user_info 表中选择 class_id 和每个班级的最大 time 值。
- 使用 GROUP BY class_id 对数据按班级分组。
- 使用 MAX(time) 函数计算每个班级的最大时间值。
2、外层查询:
- 外层查询使用 JOIN 操作连接子查询结果和 user_info 表。
- JOIN 条件是 u.class_id = latest.class_id AND u.time = latest.max_time,这确保了对于每个班级,只有时间值等于该班级最大时间值的记录被选取出来
🔴写法2:
sql
SELECT user.user_id, user.class_id, user.user_name, user.time
FROM (
SELECT user_id, class_id, user_name, time
FROM user_info
ORDER BY time DESC
) AS user
GROUP BY user.class_id;
释意:
1、子查询:
- 子查询从 user_info 表中选择 user_id, user_name, 和 time 字段。
- 子查询按照 time 字段降序排列,这意味着最近的时间将排在前面。
2、外层查询:
- 外层查询从子查询的结果集中选择所有字段。
- 使用 GROUP BY user.user_id 对结果集按 user_id 分组,这意味着每个 user_id 将只保留一条记录MySQL 5版本的写法:
2、MySQL 8版本的写法
sql
SELECT user_id, class_id, user_name, time
FROM (
SELECT user_id, class_id, user_name, time,
ROW_NUMBER() OVER (PARTITION BY class_id ORDER BY time DESC) AS rn
FROM user_info
) AS user
WHERE rn = 1;
释意:
1、子查询:使用窗口函数 ROW_NUMBER() 来对每个class_id分组,并按照time降序排列。
2.、外层查询:选择每个class_id中 rn 等于 1 的记录,这样可以获得每个班级最新的用户信息