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'
但是,当一次搜索两个设置时这不起作用?
是否可以通过一条语句来解决这个问题?查询这些数据最有效的方法是什么?
最佳答案
一种方法使用聚合和具有
:
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)
)。
关于mysql - SQL 一对多关系 - 如何根据多个对多属性来选择行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51153040/