Запрос MYSQL только в наборе

#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 ваш ответ.