Одновременный выбор нескольких значений из одного поля одной таблицы 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 шт):
Нашел решение: нужно подключать таблицу со значениями параметров саму на себя столько раз, сколько запрашивается параметров.
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')