1

私は2つのテーブルを持っています:

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

ユーザーに "bla" 属性と "blob" 属性の両方を与えるクエリを作成するにはどうすればよいですか?

この場合、ユーザー「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 つの条件を true にする必要がある場合は、条件を 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 に答える
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 に答える