1

我有两张桌子:

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

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

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

我知道数据没有标准化。

4

5 回答 5

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'
于 2013-05-13T17:05:39.013 回答
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

轻微的性能损失。但这允许您加入并取回其他人表示不利于此方法的其他字段。

这允许扩展解决方案,而不是产生每次加入不同表的成本。此外,如果您需要关联 30 多个值,您可能会遇到允许连接数的限制。

于 2013-05-13T17:07:27.253 回答
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'
于 2013-05-13T17:07:55.223 回答
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)

于 2013-05-13T17:21:28.423 回答
0
SELECT u.name  
FROM attributes a 
JOIN users u   
   ON u.id = a.user_id 
WHERE a.name IN ('bla','bulb')
于 2013-05-13T17:06:50.080 回答