Вопрос новичка: присоединение N-N, которое соответствует ВСЕМУ списку - PullRequest
1 голос
/ 29 июня 2011

Таблицы:

-- products --
   id

-- categories --
   id

-- products_categories --
   id
   product_id
   category_id

Что может быть SQL-запросом, который возвращает все идентификаторы продуктов, которые соответствуют ВСЕМ заданному списку category_ids?

Пример: заданный список (3, 4, 5) Я хотел бы, чтобы все product_ids имели ПО МЕНЬШЕ (может быть больше) идентификатор категории 3, идентификатор категории 4 и идентификатор категории 5?

Ответы [ 2 ]

6 голосов
/ 29 июня 2011

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

  SELECT p.id
    FROM PRODUCTS p
    JOIN PRODUCTS_CATEGORIES pc ON pc.product_id = p.id
    JOIN CATEGORIES c ON c.id = pc.category_id
   WHERE c.id IN (3,4,5)
GROUP BY p.id
  HAVING COUNT(DISTINCT c.id) = 3

Это широко известно как деление Челко .

COUNT(DISTINCT c.id) должно равняться количеству значений, указанных в INпункт.В противном случае дубликаты 4/3/5 / и т. Д. Будут ложноположительными.Однако, если все пары product_id, category_id гарантированно являются уникальными, DISTINCT можно опустить.

0 голосов
/ 30 июня 2011

Еще одна опция, которую можно прочитать как двойной минус:

Показать все товары, для которых нет категории (3,4,5), для которых нет соответствия этому товару.

SELECT p.id
FROM PRODUCTS p
WHERE NOT EXISTS
      ( SELECT *
        FROM CATEGORIES c 
        WHERE c.id IN (3,4,5)
          AND NOT EXISTS
              ( SELECT *
                FROM PRODUCTS_CATEGORIES pc
                WHERE pc.product_id = p.id
                  AND pc.category_id = c.id
              )
      )

Это широко известно как деление Даты .

...