Mysql присоединяются к запросу для нескольких “тегов” (many-many отношения), который соответствует ВСЕМ тегам?

Я пытаюсь запросить для Объектов, которые соответствуют ВСЕМУ данному набору Тегов.

В основном я хочу, чтобы пользователи смогли прибавить все больше Тегов, чтобы отфильтровать или "сузить" их результаты поиска, отчасти как newegg.com делает.

Моя структура таблицы является таблицей Объектов, таблицей Тегов и таблицей ObjectsTags отношения MANY:MANY. Таким образом, у меня есть запрос СОЕДИНЕНИЯ как так:

SELECT * FROM Objects
LEFT OUTER JOIN ObjectsTags ON (Objects.id=ObjectsTags.object_id)
LEFT OUTER JOIN Tags ON (Tags.id=ObjectsTags.tag_id)

Я пытался использовать В пункте/условии, как это:

SELECT * FROM Objects
LEFT OUTER JOIN ObjectsTags ON (Objects.id=ObjectsTags.object_id)
LEFT OUTER JOIN Tags ON (Tags.id=ObjectsTags.tag_id)
WHERE Tags.name IN ('tag1','tag2')
GROUP BY Objects.id

Но я узнал, что это моделирует серию ORs, таким образом, чем больше тегов Вы добавляете к запросу, тем БОЛЬШЕ результатов Вы получаете вместо набора результатов, сужающего как, я надеялся.

Я также пытался делать, нескольким НРАВИТСЯ ГДЕ условия, ANDed вместе:

SELECT * FROM Objects
LEFT OUTER JOIN ObjectsTags ON (Objects.id=ObjectsTags.object_id)
LEFT OUTER JOIN Tags ON (Tags.id=ObjectsTags.tag_id)
WHERE Tags.name LIKE 'tag1' 
AND Tags.name LIKE 'tag2'
GROUP BY Objects.id

Но это не возвращает результатов, с тех пор когда результаты группируются, ВНЕШНИЙ столбец JOINed Tags.name просто содержит 'tag1', и не также 'tag2'. Строка результата, где подобранный 'tag2' "скрыт" ГРУППИРОВКОЙ.

Как я могу соответствовать ВСЕМ тегам, чтобы получить "сужение" или "выполнить развертку" эффекта, который я после?Спасибо.

20
задан thaddeusmt 16 July 2010 в 17:57
поделиться

1 ответ

Использование:

  SELECT * 
    FROM OBJECTS o
    JOIN OBJECTSTAGS ot ON ot.object_id = o.id
    JOIN TAGS t ON t.id = ot.tag_id
   WHERE t.name IN ('tag1','tag2')
GROUP BY o.id
  HAVING COUNT(DISTINCT t.name) = 2

Вы пропустили предложение HAVING.

Нет необходимости LEFT JOIN, если вам нужны только строки, в которых существуют оба тега.

29
ответ дан 30 November 2019 в 00:39
поделиться
Другие вопросы по тегам:

Похожие вопросы: