【发布时间】:2020-01-20 22:47:29
【问题描述】:
我有 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
但在这种情况下,它会返回符合任何条件的玩家,而我只想要同时符合这两个条件的玩家。在这个具体的例子中,它应该只返回带有id0000001的播放器。
我知道我可以为每个不同的统计数据使用不同的LEFT JOIN,但事实是实际表格很大并且有大量不同的统计数据,所以我不认为这是一个选择,因为它会非常慢。
【问题讨论】:
-
如果没有 PRIMARY KEY,事情可能会变得非常棘手
-
欢迎来到 EAV 模式的丑陋世界。
标签: mysql sql left-join where-clause entity-attribute-value