You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用单条查询获取用户最新测验并关联模块表获取模块名?

绝对可以!完全能用单条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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.20 08:58:44