Выбор объектов с использованием нескольких критериев из объекта ассоциации «многие ко многим»

У меня возникают проблемы с выбором объектов типа Продукт, если продукт имеет две или более категорий.

У меня есть следующие таблицы:

product
============
product_id (PK)
name

category
============
category_id (PK)
name

и их ассоциация:

product_category
============
product_id (PFK)
category_id (PFK)

Теперь проблема в том, что я не могу выбрать продукт в соответствии с несколькими category.category_id, используя таблицу product_category.

Например: я хочу выбрать все продукты, которые относятся к категории 1 и 2, это означает, что в таблице product_category есть два вхождения.

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

SELECT p.*
FROM product p
JOIN product_category pc using(product_id)
WHERE category_id = 1;

Но как я могу выбрать, где продукт имеет category_id 1 и 2? Запрос должен возвращать только продукты, в которых связаны обе категории.

WHERE category_id = 1 and category_id = 2;

Это явно невозможное совпадение, но как я могу обойти это? Это вообще возможно?

Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
В последние годы архитектура микросервисов приобрела популярность как способ построения масштабируемых и гибких приложений. Laravel , популярный PHP...
Как построить CRUD-приложение в Laravel
Как построить CRUD-приложение в Laravel
Laravel - это популярный PHP-фреймворк, который позволяет быстро и легко создавать веб-приложения. Одной из наиболее распространенных задач в...
Освоение PHP и управление базами данных: Создание собственной СУБД - часть II
Освоение PHP и управление базами данных: Создание собственной СУБД - часть II
В предыдущем посте мы создали функциональность вставки и чтения для нашей динамической СУБД. В этом посте мы собираемся реализовать функции обновления...
Документирование API с помощью Swagger на Springboot
Документирование API с помощью Swagger на Springboot
В предыдущей статье мы уже узнали, как создать Rest API с помощью Springboot и MySql .
Роли и разрешения пользователей без пакета Laravel 9
Роли и разрешения пользователей без пакета Laravel 9
Этот пост изначально был опубликован на techsolutionstuff.com .
Как установить LAMP Stack - Security 5/5 на виртуальную машину Azure Linux VM
Как установить LAMP Stack - Security 5/5 на виртуальную машину Azure Linux VM
В предыдущей статье мы завершили установку базы данных, для тех, кто не знает.
0
0
64
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

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

SELECT p.*
       FROM product p
            INNER JOIN (SELECT pc.product_id
                               FROM product_category pc
                               WHERE pc.category_id IN (1, 2)
                               GROUP BY pc.product_id
                               HAVING count(DISTINCT pc.category_id) = 2)
                       ON pc.product_id = p.product_id;

Спасибо! Проблема решена, но я использовал внутренний выбор в предложении WHERE, например WHERE product_id в (SELECT...).

t4dohx 25.04.2019 00:26

Другие вопросы по теме