SQL запрос для выбора через связь
Добавлено: 2018.06.03, 01:25
Делаю фильтр товаров для ИМа. Есть таблица товаров, характеристик и таблица прикрученных к товару значений для фильтра (shop_values), не отдельные значения, а уже принадлежащие конкретному товару.
shop_products
===========
id
name
shop_characteristics
===========
id
values (json)
shop_values
===========
product_id
characteristic_id
value
С фронта получаю данные characteristic_id и value и могу выбрать все товары с этими параметрами через связь таким образом:
Если в рамках группы характеристик (один и тот же characteristic_id) сделать множественный выбор на фронте, то тоже удается выполнить запрос и найти все товары, изменив условие
но если сделать множественный выбор между группами хар-к (разные characteristic_id), то найти ничего не удается, хотя товар имеет обе характеристики и оба значения привязаны в таблице shop_value
Судя по всему, сделать так не получается, потому что связи записаны двумя отдельными строками в БД.
Вопрос как правильно написать SQL-запрос или же как тогда спроектировать хранение связей?
Важный момент - условие между группами хар-к должно быть AND, а не OR, иначе множественный выбор будет выбирать все подряд.
shop_products
===========
id
name
shop_characteristics
===========
id
values (json)
shop_values
===========
product_id
characteristic_id
value
С фронта получаю данные characteristic_id и value и могу выбрать все товары с этими параметрами через связь таким образом:
Код: Выделить всё
SELECT `p`.* FROM `shop_products` `p`
LEFT JOIN `shop_values` `fv` ON `p`.`id` = `fv`.`product_id`
WHERE ((`fv`.`characteristic_id`=3) AND (`fv`.`value`='уличные'))
Код: Выделить всё
...
WHERE ((`fv`.`characteristic_id`=3) AND (`fv`.`value`='уличные'))
OR ((`fv`.`characteristic_id`=3) AND (`fv`.`value`='внутренние'))
Код: Выделить всё
...
WHERE ((`fv`.`characteristic_id`=3) AND (`fv`.`value`='уличные'))
AND ((`fv`.`characteristic_id`=5) AND (`fv`.`value`='белый'))
Вопрос как правильно написать SQL-запрос или же как тогда спроектировать хранение связей?
Важный момент - условие между группами хар-к должно быть AND, а не OR, иначе множественный выбор будет выбирать все подряд.