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

rqcrx0a6  于 2021-06-20  发布在  Mysql
关注(0)|答案(1)|浏览(312)

这个问题在这里已经有答案了

在不同的行上选择满足不同条件的值(6个答案)
两年前关门了。
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'

但是,一次搜索两个设置时,这不起作用?
用一句话就能解决这个问题吗?查询这些数据最有效的方法是什么?

s1ag04yj

s1ag04yj1#

一种方法使用聚合和 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) ).

相关问题