将不同的独立过滤器应用于 GROUP BY 中的同一列
Apply different independent filters to the same column in a GROUP BY
我有 2 个 table,players
和 stats
。
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 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
但那样的话,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)
上的索引,这应该是一个有效的选择。
我有 2 个 table,players
和 stats
。
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 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
但那样的话,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)
上的索引,这应该是一个有效的选择。