SQL一对多关系-如何根据多个属性选择行?

时间:2018-07-03 11:05:45

标签: mysql sql select left-join one-to-many

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'

但是,一次搜索两个设置时,这不起作用吗?

是否可以用一个语句解决这个问题?查询此数据的最有效方法是什么?

1 个答案:

答案 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))。