如何用单条查询获取用户最新测验并关联模块表获取模块名?
绝对可以!完全能用单条SQL查询实现你的需求——咱们只需要把「获取目标表最新行」和「关联模块表取名称」这两个逻辑整合到同一条语句里就行。下面给你两种实用的实现方案,适配不同的数据库场景:
方法一:窗口函数(推荐,适配PostgreSQL、MySQL 8+、SQL Server等现代数据库)
这种方式逻辑清晰,扩展性强,尤其适合需要按用户分组取最新数据的场景:
-- 假设你的测验结果表叫quiz_results,模块表叫modules SELECT qr.*, m.name AS module_name FROM ( -- 先给每个用户的测验行按时间倒序编号,最新的行编号为1 SELECT *, ROW_NUMBER() OVER (PARTITION BY user_id ORDER BY created_at DESC) AS row_num FROM quiz_results ) qr -- 关联模块表,通过module_id匹配模块名称 JOIN modules m ON qr.module_id = m.id -- 只保留每个用户的最新行 WHERE qr.row_num = 1;
如果你的需求是单用户的最新测验(不是所有用户),只需要去掉PARTITION BY user_id这部分即可。
方法二:子查询关联(适配MySQL 5.x等老版本数据库)
如果你的数据库不支持窗口函数,可以用子查询先锁定最新行的时间,再关联获取数据:
SELECT qr.*, m.name AS module_name FROM quiz_results qr JOIN modules m ON qr.module_id = m.id -- 子查询找出每个用户的最新测验时间 JOIN ( SELECT user_id, MAX(created_at) AS latest_quiz_time FROM quiz_results GROUP BY user_id ) latest_q ON qr.user_id = latest_q.user_id AND qr.created_at = latest_q.latest_quiz_time;
小提示
- 如果
created_at字段可能存在重复值(比如同一用户同一时间提交了多次测验),方法一只会返回其中一行,方法二则会返回所有同时间的最新行,你可以根据业务需求选择。 - 确保
module_id在两张表中都是有效的关联字段(比如modules表的主键是id,且quiz_results的module_id是外键),这样关联不会出现数据遗漏。
内容的提问来源于stack exchange,提问作者Zestyy99
相关产品推荐
相关产品推荐

