Одновременный выбор нескольких значений из одного поля одной таблицы MySQL

Помогите пожалуйста разобраться. Нужно сделать параметрический поиск товаров на сайте. Есть 3 MySQL-таблицы (приведу сокращенное количество полей):

1. positions (Товары)
id - идентификатор (bigint 20)
code - код товара (int 10)
rubric_code - код группы товаров
name - наименование (varchar 255)
2. products_params (Параметры товаров)
id - идентификатор (bigint 20)
name - наименование (varchar 255)
3. products_params_values (Значения параметров товаров)
id - идентификатор (bigint 20)
product_code - код товара (bigint 20)
param_id - идентификатор параметра (bigint 20)
value - значение (varchar 255)

Моя задача: сформировать правильный SQL-запрос, который будет искать товары, содержащие определенные параметры посредством логического И (AND), а не ИЛИ (OR)

Мне удалось написать следующий SQL-запрос, но он осуществляет поиск товаров по логическому ИЛИ (OR):

SELECT
    DISTINCT `positions`.`id`
FROM
    `positions`

LEFT JOIN `products_params_values`
ON `products_params_values`.`product_code` = `positions`.`code`

WHERE
    `positions`.`rubric_code` = '16291'
AND
    `products_params_values`.`param_id` = '1290' AND `products_params_values`.`value` IN('smd 0805')
OR
    `products_params_values`.`param_id` = '1326' AND `products_params_values`.`value` IN('17','35','40')

В данном случае подзапросы с условиями значений параметров:

`products_params_values`.`param_id` = '1290' AND `products_params_values`.`value` IN('smd 0805')

содержат 100 товаров

`products_params_values`.`param_id` = '1326' AND `products_params_values`.`value` IN('17','35','40')

содержат 3 товаров из эти 100

Если в последнем подзапросе OR заменить на AND, то товаров не будет найдено. Данный запрос находит 100 товаров. А должен 3. Как осуществить поиск с применение именно AND? Что я тут делаю не так?

Помогите пожалуйста разобраться! Буду невероятно признателен!


Ответы (1 шт):

Автор решения: INT one

Нашел решение: нужно подключать таблицу со значениями параметров саму на себя столько раз, сколько запрашивается параметров.

 SELECT
    `positions`.`code`
FROM
    `positions`

LEFT JOIN `products_params_values` AS `ppv_1`
ON `ppv_1`.`product_code` = `positions`.`code`

LEFT JOIN `products_params_values` AS `ppv_2`
ON `ppv_2`.`product_code` = `positions`.`code`

WHERE
    `positions`.`rubric_code` = '16291'
AND
    `ppv_1`.`param_id` = '1290' AND `ppv_1`.`value` IN('smd 0805')
AND
    `ppv_2`.`param_id` = '1326' AND `ppv_2`.`value` IN('35','17','40')
→ Ссылка