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

如何用SQL筛选出回答了与游戏4所有相同问题的用户?

解决方案:筛选覆盖游戏4所有问题的用户

首先先明确你的数据表结构:

表ANSWER

idAnswer idQuestion Status idGame
----------------------------------------
1        9          1      1
2        6          NULL   1
3        6          1      2
4        3          NULL   2
5        1          1      3
6        6          1      3
7        9          1      4
8        6          1      4

表GAME

idGame idUser
----------------
1      Greg
2      Greg
3      Jack
4      Frank

你的需求是找出所有至少回答了游戏4中所有已回答问题的用户(无论回答是在单个游戏还是多个游戏中完成),其中Status IS NOT NULL表示该问题已被有效回答。

实现思路

  1. 先提取游戏4中所有的有效问题(即Status IS NOT NULL的idQuestion);
  2. 统计每个用户所有有效回答的问题集合;
  3. 检查用户的有效问题集合是否完全覆盖游戏4的所有有效问题,满足条件的用户即为目标结果。

最终SQL查询

WITH game4_target_questions AS (
    -- 获取游戏4的所有已回答问题(去重)
    SELECT DISTINCT idQuestion
    FROM ANSWER
    WHERE idGame = 4 AND Status IS NOT NULL
),
user_valid_answers AS (
    -- 获取每个用户所有已回答的问题(去重,仅保留Status非NULL的记录)
    SELECT DISTINCT g.idUser, a.idQuestion
    FROM ANSWER a
    INNER JOIN GAME g ON a.idGame = g.idGame
    WHERE a.Status IS NOT NULL
)
-- 筛选出覆盖所有目标问题的用户
SELECT u.idUser
FROM user_valid_answers u
RIGHT JOIN game4_target_questions q ON u.idQuestion = q.idQuestion
GROUP BY u.idUser
HAVING COUNT(DISTINCT q.idQuestion) = (SELECT COUNT(*) FROM game4_target_questions);

查询解释

  • game4_target_questions:这个CTE会得到游戏4的有效问题集合,这里是6和9;
  • user_valid_answers:这个CTE会整理每个用户所有已回答过的问题(去重),比如Greg的有效问题是1、6、9,Frank的是6、9,Jack的是6;
  • 最后的RIGHT JOIN会将每个用户的有效问题与目标问题匹配,通过HAVING子句判断用户是否覆盖了所有目标问题:只有当匹配到的目标问题数量等于目标问题总数时,该用户才符合条件。

执行这个查询后,得到的结果就是:

idUser
-------
Greg
Frank

内容的提问来源于stack exchange,提问作者NekiCoule

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.29 07:50:05