我有两张桌子:
users attributes
id|name id|name|user_id
------- ---------------
1 |foo 1 |bla | 1
2 |bar 1 |blub| 1
1 |bla | 2
如何创建一个查询为用户提供“bla”和“blub”属性?
在这种情况下,它应该只返回用户“foo”。
我知道数据没有标准化。
我有两张桌子:
users attributes
id|name id|name|user_id
------- ---------------
1 |foo 1 |bla | 1
2 |bar 1 |blub| 1
1 |bla | 2
如何创建一个查询为用户提供“bla”和“blub”属性?
在这种情况下,它应该只返回用户“foo”。
我知道数据没有标准化。
SELECT u.*, a.id, b.Id, a.name, b.name FROM users u
JOIN attributes a
ON a.User_id = u.User_id AND a.name = 'bla'
JOIN attributes b
ON u.User_Id = b.User_id AND b.name = 'blub'
假设与用户的属性关联是唯一的......
如果您需要 3 个条件为真,请将条件添加到 in 并向上调整计数 1。
SELECT u.name
FROM users u
INNER JOIN attributes a on A.user_Id = u.id
WHERE a.name in ('bla','blub')
GROUP by u.name
HAVING count(*)=2
如果您没有唯一的关联,或者您需要加入另一个表,您总是可以这样做......
SELECT u.name
FROM users u
INNER JOIN attributes a on A.user_Id = u.id
WHERE a.name in ('bla','blub')
GROUP by u.name
HAVING count(distinct A.name)=2
轻微的性能损失。但这允许您加入并取回其他人表示不利于此方法的其他字段。
这允许扩展解决方案,而不是产生每次加入不同表的成本。此外,如果您需要关联 30 多个值,您可能会遇到允许连接数的限制。
SELECT U.NAME
FROM USERS U
INNER JOIN
ATTRIBUTES A1
ON U.ID = A1.USER_ID
INNER JOIN
ATTRIBUTES A2
ON U.ID = A2.USER_ID
WHERE A1.NAME = 'bla'
AND A2.NAME = 'blub'
您可以使用 INTERSECT 运算符
SELECT
u.id
,u.name
FROM users AS u
INNER JOIN attributes AS a
ON u.id = a.user_id
WHERE a.name = 'bla'
INTERSECT
SELECT
u.id
,u.name
FROM users AS u
INNER JOIN attributes AS a
ON u.id = a.user_id
WHERE a.name = 'blub'
;
这是关于 SQL Fiddle 的演示:http ://sqlfiddle.com/#!6/68986/5
有关 SQL 中 SET 操作的更多信息:http://en.wikipedia.org/wiki/Set_operations_(SQL)
SELECT u.name
FROM attributes a
JOIN users u
ON u.id = a.user_id
WHERE a.name IN ('bla','bulb')