如何匹配表连接的多个条件?

时间:2013-05-13 17:01:40

标签: sql

我有两张桌子:

users          attributes
id|name        id|name|user_id
-------        ---------------
1 |foo         1 |bla | 1
2 |bar         1 |blub| 1
               1 |bla | 2

如何创建查询为用户提供“bla”和“blub”属性?

在这种情况下,它应该只返回用户“foo”。

我知道数据没有标准化。

5 个答案:

答案 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')