Поиск продуктов с несколькими категориями

#sql-server

#sql-server

Вопрос:

У меня есть таблицы «Продукты», «Категории» и таблица отношений для внешних ключей «ProductsToCategories» классическим способом нормализации.

В моем приложении вы можете выбрать категорию с помощью выпадающего списка, но я хочу переключиться на радиокнопки, где пользователь может выбрать более одной категории.

Как я могу реализовать запрос, чтобы найти только продукты, в которых несколько объектов совпадают в таблице отношений?

Псевдокод: выберите * из продуктов для внутреннего объединения ProductsToCategories … где Category-ID = 35 И Category-ID = 36 И Category-ID = 9

Ответ №1:

Один простой вариант использует агрегирование:

 SELECT
    p.id,
    p.name
FROM Products p
INNER JOIN ProductsToCategories pc
    ON p.id = pc.product_id
WHERE
    pc.category_id IN (9, 35, 36)
GROUP BY
    p.id,
    p.name
HAVING
    COUNT(DISTINCT pc.category_id) = 3;
  

Основная идея здесь заключается в агрегировании по каждому продукту, сначала удаляя все записи, кроме тех, которые принадлежат к трем интересующим категориям. Затем мы утверждаем, что остаются три отдельные категории, подразумевая, что продукт соответствует.