2011-01-19 5 views
4

シナリオは非常に単純である:MySQLは:IDがテーブルBに2(または任意のN)の行と一致した場合、表Aから選択

Table A: 
+----+-------+-... 
| id | title | ... 
+----+-------+-... 

Table B: 
+------+-----+ 
| id_A | tag | 
+------+-----+ 
:私はテーブルBにコンテンツのテーブルAのコンテンツとタグを持っています

私は、タグ「foo」を持っているA内のすべてのコンテンツの行を、選択したい:

SELECT A.* FROM A, B WHERE A.id = B.id_A AND B.tag = 'foo' 

これまでのところ、それは簡単です。

私の問題がある:どのように私はタグ「foo」でタグ「バー」の両方を持っているコンテンツの行を、選択することができますか?特に、どのように私は任意n > 1ためnタグ「FOO」、「バー」、...を持っている行を選択することができますか?

ソリューションは、Bにn回に参加するだろうが、それは本当にパフォーマンスではないということ、それは悪い感じ、と私は想定しています。

私はMySQL、PHP、PDOをプリペアドステートメントで使用しているので、必要な文字列連結(「n回の結合」ソリューションのような)がないソリューションがあれば、それが私のお気に入りです。

答えて

4
SELECT * 
FROM a 
WHERE (
     SELECT COUNT(*) 
     FROM b 
     WHERE b.id_a = a.id 
       AND b.tag IN ('foo', 'bar', 'baz') 
     ) = 3 
+0

+1:ただし、なぜあなたはidsでの結合を避けたのですか? – VoodooChild

+0

ありがとう、それは私が必要とする方法とまったく同じです。 – Boldewyn

関連する問題