[英]Apply different independent filters to the same column in a GROUP BY
我有 2 个表, players
和stats
。
牌桌players
有一个id
和一个name
,而牌桌stats
如下所示:
id | Player | Stat | Value
1 | 0000001 | Wins | 5
2 | 0000001 | Loses | 6
3 | 0000001 | Jumps | 156
4 | 0000001 | Shots | 580
5 | 0000002 | Wins | 15
6 | 0000002 | Loses | 2
7 | 0000002 | Jumps | 530
8 | 0000002 | Shots | 1704
我想过滤符合多个条件的玩家,例如,获胜次数超过 5 次但跳跃次数少于 200 次的玩家。
我试过这个
SELECT players.name
FROM players
LEFT JOIN stats
ON stats.player = players.id
WHERE (stats.stat = "Wins" AND stats.value > 5)
AND (stats.stat = "Jumps" AND stats.value < 200)
GROUP BY players.id
但它没有返回任何内容,因为GROUP BY
在WHERE
之后。 我也尝试使用OR
。
SELECT players.name
FROM players
LEFT JOIN stats
ON stats.player = players.id
WHERE (stats.stat = "Wins" AND stats.value > 5)
OR (stats.stat = "Jumps" AND stats.value < 200)
GROUP BY players.id
但在那种情况下,它会返回符合任何条件的玩家,而我只想要符合这两个条件的玩家。 在这个具体的例子中,它应该只返回id
0000001
的玩家。
我知道我可以为每个不同的统计数据使用不同的LEFT JOIN
来做到这一点,但事实是实际的表很大并且有大量不同的统计数据,所以我认为这不是一个选择,因为它会非常慢。
没有必要聚合。 您可以使用两个内部联接来执行此操作,每个条件一个:
SELECT p.name
FROM player p
INNER JOIN stats s1 ON s1.player = p.id AND s1.stat = 'Wins' AND s1.value > 5
INNER JOIN stats s2 ON s2.player = p.id AND s2.stat = 'Jumps' AND s2.value < 200
有了stats(player, stat, value)
的索引,这应该是一个有效的选择。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.