#mysql #sql #search #group-by
#mysql #sql #Поиск #группировка по
Вопрос:
У меня есть таблица, которая связывает записи с соответствующими тегами со следующими данными в ней:
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%";
Ответ №1:
If (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. Мне нравится первый предложенный вами запрос, он прост и совершенен. Большое вам спасибо.
Ответ №2:
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)
Ответ №3:
Это хороший случай для самостоятельного объединения…
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;
Комментарии:
1. Этот же ответ был опубликован ранее 🙂
2. Вы, ребята, всегда слишком быстры для меня! 1 ваш ответ.