MySQL выбирает где, но не в соединении - PullRequest
3 голосов
/ 16 февраля 2011

В моей базе данных три таблицы:

Продукты

  • id (int, первичный ключ)
  • имя (варчар)

Метки

  • id (int, первичный ключ)
  • имя (варчар)

ProductTags

  • product_id (int)
  • tag_id (int)

Я делаю SQL-запрос, чтобы выбрать продукты с назначенными тегами с заданными идентификаторами:

SELECT * FROM Products
JOIN ProductTags ON Products.id = ProductTags.product_id
WHERE ProductTags.tag_id IN (1,2,3)
GROUP BY Products.id

Я могу выбрать товары без присвоенных тегов с указанными идентификаторами:

SELECT * FROM Products
JOIN ProductTags ON Products.id = ProductTags.product_id
WHERE ProductTags.tag_id NOT IN (4,5,6)
GROUP BY Products.id

Как можно объединить эти запросы, чтобы выбрать товары, имеющие заданные теги, но не имеющие других тегов? Я пытался добиться этого таким образом:

SELECT * FROM Products
JOIN ProductTags ON Products.id = ProductTags.product_id
WHERE ProductTags.tag_id IN (1,2,3)
AND ProductTags.tag_id NOT IN (4,5,6)
GROUP BY Products.id

Но это, очевидно, не работает, давая мне продукты с тегами (1,2,3), независимо от того, назначены они тегам (4,5,6) или нет. Возможно ли решить эту проблему одним запросом?

1 Ответ

3 голосов
/ 16 февраля 2011

Используйте подзапрос, чтобы отфильтровать список товаров, которые содержат нежелательные теги:

SELECT * FROM Products
  JOIN ProductTags ON Products.id = ProductTags.product_id
  WHERE ProductTags.tag_id IN (1,2,3)
    AND Products.id NOT IN (SELECT product_id FROM ProductTags WHERE tag_id IN (4,5,6))
  GROUP BY Products.id
...