如何筛选同时游玩GameTypeID=222下两类游戏的玩家?
解决方法
关键逻辑梳理
要拿到符合要求的玩家,得盯死两个核心条件:
- 只算GameTypeID=222分类下的游戏
- 玩家必须同时玩过该分类里「GameName带%pjp%」和「GameName不带%pjp%」的游戏,缺一个都不行
修正后的SQL代码
SELECT x.PlayerID, x.Cellphone, x.FirstName, x.LastName FROM TableX x JOIN TableZ z ON x.PlayerID = z.PlayerID JOIN TableY y ON z.GameID = y.GameID WHERE y.GameTypeID = 222 -- 直接把非222类的游戏全过滤掉,从源头避免脏数据 GROUP BY x.PlayerID, x.Cellphone, x.FirstName, x.LastName HAVING -- 确认玩家玩过至少一款带%pjp%的222类游戏 SUM(CASE WHEN y.GameName LIKE '%pjp%' THEN 1 ELSE 0 END) > 0 AND -- 确认玩家玩过至少一款不带%pjp%的222类游戏 SUM(CASE WHEN y.GameName NOT LIKE '%pjp%' THEN 1 ELSE 0 END) > 0 -- 可选:如果要求玩家只玩222类游戏(不能玩其他分类),就加上下面这行 -- AND COUNT(DISTINCT y.GameTypeID) = 1;
代码解释
WHERE y.GameTypeID = 222:这是解决你之前返回非222类数据的关键——提前把无关的游戏记录筛掉,不让它们进入后续聚合计算GROUP BY:按玩家分组,方便统计每个玩家的游戏类型覆盖情况HAVING里的两个统计:分别验证玩家是否同时满足两类游戏的游玩要求,只有两个条件都满足才会被选中- 最后那行可选代码:如果你的需求是「玩家只能玩222类的这两种游戏,不能碰其他分类」,就加上;如果允许玩家同时玩其他分类但必须满足222类的两种要求,删掉就行
内容的提问来源于stack exchange,提问作者Maria
相关产品推荐
相关产品推荐

