MySQL数据库包含两个具有一对多关系的表:一个用户可以有许多设置:
Users:
id username password
--------------------------
1 Bob 123
2 Alice abc
...
Settings:
id user_id key value
-----------------------------
1 1 color blue // Bobs settings...
2 1 theme xy
3 1 size 5
4 2 size 5 // Alices settings...
问题:如何使用color == blue AND size == 5
查找所有用户?
使用LEFT JOIN
可以找到具有一个属性的用户:
SELECT users.id FROM users LEFT JOIN settings ON users.id = settings.user_id WHERE settings.key = 'color' AND settings.value = 'blue'
但是,一次搜索两个设置时,这不起作用吗?
是否可以用一个语句解决这个问题?查询此数据的最有效方法是什么?
答案 0 :(得分:2)
一种方法使用聚合和having
:
select s.user_id
from settings s
where (key, value) in ( ('color', 'blue'), ('size', '5') )
group by s.user_id
having count(*) = 2;
这假定没有重复的设置(如果是的话,则需要使用count(distinct)
)。