Отношение «многие ко многим» с несколькими параметрами группы - PullRequest
0 голосов
/ 26 октября 2018

Моя таблица отношений «многие ко многим» имеет несколько групп параметров, и я хочу создать SQL-запрос для получения идентификатора продукта, который содержит хотя бы один параметр в каждой группе.

+------------+-----------+
| product_id | option_id |
+------------+-----------+
| 1          | 1         |
| 1          | 3         |
| 2          | 2         |
| 3          | 4         |
+------------+-----------+

Я пробовал что-то подобное:

SELECT product_id
FROM options_to_products
WHERE (option_id = 1 OR option_id = 2)
AND (option_id = 3 OR option_id = 4)

Это ничего не дает, но я полагаю, чтобы увидеть 1. Есть идеи, как сделать такой запрос?

1 Ответ

0 голосов
/ 26 октября 2018

В одном подходе используется условное агрегирование:

SELECT product_id
FROM options_to_products
GROUP BY product_id
HAVING
    SUM(CASE WHEN option_id IN (1, 2) THEN 1 ELSE 0 END) > 0 AND
    SUM(CASE WHEN option_id IN (3, 4) THEN 1 ELSE 0 END) > 0;

Мы также можем попробовать сделать самостоятельное соединение:

SELECT DISTINCT otp1.product_id
FROM options_to_products otp1
INNER JOIN options_to_products otp2
    ON otp1.product_id = otp2.product_id AND
       (otp1.option_id IN (1, 2) AND otp2.option_id IN (3, 4) OR
       otp1.option_id IN (3, 4) AND otp2.option_id IN (1, 2));
...