Как выбрать товары из таблицы по динамическим параметрам (находятся в другой таблице)?
Здравствуйте, ситуация такая: есть таблица товаров (товары разных категорий как компьютеры так и кресла, картриджи и прочие) и есть таблица свойств товаров (по типу товар - свойство - значение) и не могу создать запрос на выборку по нескольким параметрам так как при joine'е этих таблиц получается несколько строк одного товара в каждой одно отдельное свойство. Может кто знает как выбрать товары по нескольким параметрам, если мне например нужен товар с color = черный и interface = usb? Заранее благодарю за помощь.
Ну пока там всего 3 таблицы, в одной хранятся категории, в другой товары а в последней их свойства (застрял на поиске товаров из за того что все свойства разбиты по строкам не пойму как искать.)
SELECT `i`.*
FROM `items` AS `i`
JOIN `properties` AS `p1` ON `p1`.`item_id` = `i`.`id`
AND `p1`.`name` = 'цвет' AND `p1`.`value` = 'чёрный'
JOIN `properties` AS `p2` ON `p2`.`item_id` = `i`.`id`
AND `p2`.`name` = 'размер' AND `p2`.`value` = 'XXXL'
Я ведь так получу, список всех товаров у которых есть хотя бы одно свойство, но я не совсем понял как мне искать товары с несколькими параметрами, то есть:
id | product | attribute | value
1 | product1 | color | Black
2 | product1 | color | Red
3 | product1 | interface | SSD
4 | product2 | color | Green
5 | product2 | color | Green
6 | product2 | interface | USB
Как выбрать товар где color = Red, color = Black, interface = SSD если это разные строки?
каждый left join даст как бы признак того, что "принадлежит или нет" в виде действительного или null id в присоединяемой таблице
соответственно дальше в условии можно уже комбинировать через and и or
т.е. (t1.id is not null) and (t2.id is not null) and (t3.id is not null) - для случая когда есть все свойства, а
(t1.id is not null) or (t2.id is not null) or (t3.id is not null) - хотя бы одно
Если все это обернуть в хранимую процедуру с кучкой неких булевых признаков с1..сN означающих "интересует ли этот критерий" и слегка модифицировав where:
(c1=0 or t1.id is not null) and (c2=0 or t2.id is not null) and (c3=0 or t3.id is not null)
То получим легкий способ "ставить галочки" по каким критериям отбирать, а какие не важны (если с2=0 - то значит фильтрации по t2 не будет)