一个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?
color == blue AND size == 5
使用a LEFT JOIN,找到具有一个属性的用户是没有问题的:
LEFT JOIN
SELECT users.id FROM users LEFT JOIN settings ON users.id = settings.user_id WHERE settings.key = 'color' AND settings.value = 'blue'
但是,一次搜索两个设置时,这不起作用吗?
有可能用一个语句解决这个问题吗?查询此数据的最有效方法是什么?
一种方法使用聚合和having:
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))。
count(distinct)