我有两张桌子:
users attributes
id|name id|name|user_id
------- ---------------
1 |foo 1 |bla | 1
2 |bar 1 |blub| 1
1 |bla | 2
如何创建查询为用户提供“bla”和“blub”属性?
在这种情况下,它应该只返回用户“foo”。
我知道数据没有标准化。
答案 0 :(得分:4)
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'
答案 1 :(得分:2)
假设与用户的属性关联是唯一的......
如果您需要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
轻微的性能影响。但是这允许你加入并获取其他人指出的其他字段对这种方法有害。
这允许扩展解决方案,而不是每次都加入到不同的表中。此外,如果您需要关联三十多个值,则可能会对允许的连接数量产生限制。
答案 2 :(得分:1)
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'
答案 3 :(得分:1)
您可以使用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)
答案 4 :(得分:0)
SELECT u.name
FROM attributes a
JOIN users u
ON u.id = a.user_id
WHERE a.name IN ('bla','bulb')