admin

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

sql

一个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

使用a LEFT JOIN,找到具有一个属性的用户是没有问题的:

SELECT users.id FROM users LEFT JOIN settings ON users.id = settings.user_id WHERE settings.key = 'color' AND settings.value = 'blue'

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

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


阅读 149

收藏
2021-07-01

共1个答案

admin

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

2021-07-01