2012-12-11 9 views
10

私は相互参照表を持っている:MySQLの - すべてのタグに一致する選択IDS

ID | tag 
1 | 4 
1 | 5 
1 | 6 
2 | 4 
2 | 5 
2 | 8 
3 | 2 

私はタグのセットのすべてに一致するIDを選択する必要があります。例えば、私がタグ'4','5'を与えられた場合、私はID '1','2'を得るでしょう。タグが与えられた場合'4','2'すべてのタグが一致するIDがなかったので、私はIDを取得しません。タグのすべて。

私はタグ'4','9'与えられた場合'9'の検索はNULL値につながるので、また、私はまた、すべての結果のIDを取得べきではありませんので、何のIDがすべてタグが一致しません。

私は最後の2日間私の髪を引っ張ってきました。うまくいけば誰かが私を助けることができます。

+0

タグ ' '4'、 '8''与える必要がありますあなたは結果として 'ID = 2'、彼らはすべきではありませんか? –

+0

はい、あなたは正しいです。私の間違い - 私はそれを修正することができます私に見てみましょう。 – user1113531

+1

この(共通の)問題を解決する10以上の方法については、この質問も参照してください。** [SQLの結果を多人数の関係でフィルタリングする方法](http://stackoverflow.com/questions/7364969/how 〜to-filter-sql-results-in-a-has-many-through-relation)** –

答えて

17

WHERE句で指定した値の数にレコード数を一致させる必要があるという考え方があります。ユニーク制約は、すべてのIDのタグで指定されていない場合

SELECT ID 
FROM tableName 
WHERE tag IN (4, 8) 
GROUP BY ID 
HAVING COUNT(*) = 2 

は、その後、DISTINCTが必要とされている

SELECT ID 
FROM tableName 
WHERE tag IN (4, 8) 
GROUP BY ID 
HAVING COUNT(DISTINCT tag) = 2 
+0

速やかな応答と私の正気の維持に感謝します。それは素晴らしい作品です!最初の提案が完璧なので、タグには一意の制約があります。 – user1113531

+0

あなたは大歓迎です。 ':D' –

+0

私のヒーロー!私は20行のクエリで私の髪をリッピングしていた、私が欠けていたのはその部分だった! – NaturalBornCamper

関連する問題