MySQL: выберите из таблицы A, если ID соответствует 2 (или произвольному n) строкам в таблице B - PullRequest
4 голосов
/ 19 января 2011

Сценарий довольно прост: у меня есть содержимое в таблице A и теги для содержимого в таблице B:

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

Table B:
+------+-----+
| id_A | tag |
+------+-----+

Я хочу выбрать все строки содержимого в A, которые имеют тег 'foo':

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

Пока все просто.

Моя проблема заключается в следующем: как выбрать строки содержимого, которые имеют и тег 'foo' и тег 'бар'?В частности, как я могу выбрать строки, которые имеют n теги 'foo', 'bar', ... для произвольно n > 1?

Решением было бы присоединиться к B n раз, но это плохо, и я предполагаю, что это не очень эффективно.

Поскольку я использую MySQL, PHP и PDO с подготовленными выражениями, если есть решение, которое обходится без необходимой конкатенации строк (например,в решении «Join n times» в части PHP, это было бы моим любимым.

1 Ответ

4 голосов
/ 19 января 2011
SELECT  *
FROM    a
WHERE   (
        SELECT  COUNT(*)
        FROM    b
        WHERE   b.id_a = a.id
                AND b.tag IN ('foo', 'bar', 'baz')
        ) = 3
...