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

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

我有 2 个 table,playersstats

Table players 有一个 id 和一个 name,而 table 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

但是 return 没什么,因为 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

但那样的话,return是满足任意一个条件的玩家,我只想要同时满足两个条件的玩家。在这个具体的例子中,它应该只有 return 玩家 id 0000001.

我知道我可以为每个不同的统计数据使用不同的 LEFT JOIN,但事实是实际的 table 很大并且有很多不同的统计数据,所以我不认为是一个选项,因为它会很慢。

不需要汇总。您可以使用两个内部联接来执行此操作,每个条件一个:

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) 上的索引,这应该是一个有效的选择。