繁体   English   中英

将不同的独立过滤器应用于 GROUP BY 中的同一列

[英]Apply different independent filters to the same column in a GROUP BY

我有 2 个表, playersstats

牌桌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 BYWHERE之后。 我也尝试使用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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM