MYSQL запрос только в наборе - PullRequest
4 голосов
/ 29 сентября 2011

У меня есть таблица, которая связывает записи со связанными тегами со следующими данными:

entry_id |  tag_id
1        |  1
2        |  1
3        |  1
1        |  2
2        |  2

Я пытаюсь написать запрос, который возвращает только записи, отмеченные 1 И 2, в этом примере записей1 и 2 будут возвращены, а 3 нет, потому что у него нет обоих тегов.Текущий запрос, который я использую, работает, но я знаю, что не может быть прав:

SELECT entry_id, GROUP_CONCAT(DISTINCT tag_id ORDER BY tag_id)
FROM tags
GROUP BY entry_id
HAVING GROUP_CONCAT(DISTINCT tag_id ORDER BY tag_id) LIKE "%1,2%";

Ответы [ 3 ]

2 голосов
/ 29 сентября 2011

Если (entry_id, tag_id) уникален:

SELECT entry_id
FROM yourtable
WHERE tag_id IN (1, 2)
GROUP BY entry_id
HAVING COUNT(*) = 2

Альтернативный подход, который не требует уникальности и также может быть быстрее:

SELECT T1.entry_id
FROM yourtable T1
JOIN yourtable T2
ON T1.entry_id = T2.entry_id
AND T1.tag_id = 1
WHERE T2.tag_id = 2
1 голос
/ 29 сентября 2011
SELECT entry_id
FROM tags t1 inner join tags t2 
on (t1.entry_id = t2.entry_id and t1.tag_id = 1 and t2.tag_id = 2)
0 голосов
/ 29 сентября 2011

Это хороший пример для самостоятельного объединения ...

SELECT tagged1.entry_id
FROM tags tagged1
JOIN tags tagged2
    ON tagged1.entry_id = tagged2.entry_id
        AND tagged1.tag_id = 1
        AND tagged2.tag_id = 2;
...