如何用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表示该问题已被有效回答。
实现思路
- 先提取游戏4中所有的有效问题(即
Status IS NOT NULL的idQuestion); - 统计每个用户所有有效回答的问题集合;
- 检查用户的有效问题集合是否完全覆盖游戏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
相关产品推荐
相关产品推荐

