如何筛选出在所有赛事中至少赢得一轮比赛的用户?
筛选所有赛事中至少赢一轮的用户
问题分析
你的原SQL逻辑错误在于:试图让单条results记录同时满足属于多个赛事的赢局条件——但一条记录只能对应一个轮次、一个赛事,所以永远查不到符合条件的结果。
正确思路是:统计每个用户赢过的唯一赛事数量,判断这个数量是否等于需要覆盖的总赛事数(或指定赛事的数量)。
正确SQL实现
针对所有赛事的情况
如果要筛选在全部赛事中都至少赢过一轮的用户:
SELECT r.user_id FROM results r JOIN rounds ro ON r.round_id = ro.id JOIN categories c ON ro.category_id = c.id WHERE r.result = 1 -- 标记为赢局的条件 GROUP BY r.user_id HAVING COUNT(DISTINCT c.competition_id) = (SELECT COUNT(*) FROM competitions);
针对指定赛事集合的情况
如果只需要检查特定赛事(比如你示例中的赛事7、8、9):
SELECT r.user_id FROM results r JOIN rounds ro ON r.round_id = ro.id JOIN categories c ON ro.category_id = c.id WHERE r.result = 1 AND c.competition_id IN (7, 8, 9) -- 指定要覆盖的赛事ID GROUP BY r.user_id HAVING COUNT(DISTINCT c.competition_id) = 3; -- 数字需与IN中的赛事数量一致
逻辑说明
- 通过
JOIN关联四个表,将用户的赢局记录对应到所属赛事 - 按
user_id分组,用COUNT(DISTINCT c.competition_id)统计该用户赢过的不同赛事数量 HAVING子句判断统计数量是否等于目标赛事总数,确保用户覆盖了所有要求的赛事
内容的提问来源于stack exchange,提问作者Bird87 ZA
相关产品推荐
相关产品推荐

