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

标签 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'

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

是否可以通过一条语句来解决这个问题?查询这些数据最有效的方法是什么?

最佳答案

一种方法使用聚合和具有:

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/

相关文章:

php - 获取php数组的总和

mysql - 如何最好地构建此数据库查询?

mysql - CONCAT_WS 分隔符

LINQ:选择 <条件> 或 <条件>

mysql - 在选择结果中转义空格

mysql - 搜索最佳解决方案以使其( select * from table order by rand() limit 40 )运行得更快

php - 将 Magento CE 1.6.2 升级到 1.9.1 时出错

php - fatal error : Uncaught Error: Call to a member function query() on null

sql - 如何在PostgreSQL中减去没有时区的时间戳

mysql - 在 MySQL 中使用复合键更新多行