Есть таблица товаров -
products, есть атрибуты
attributes и есть связующая таблица
atribute_product
Последняя устроена так:
product_id | attribute_id | value
Теперь стоит задача, нужно сделать фильтр товаров по атрибутам.
Например, есть атрибут
"тип изделия", там 6 вариантов -
классическое, спортивное и т.д.
Есть другой атрибут -
"форма изделия" -
круглая, овальная, квадратная и т.д.
Теперь предположим, что мы выбираем изделие
классическое или
спортивное изделие (2 из 6 варианта
типа изделия) и 2 варианта
формы изделия (
круглая и
овальная).
Теперь основной затык
Если мы конструируем запрос просто по первому атрибуту (тип изделия), то тут все очень просто
SELECT product_id FROM atribute_product WHERE attribute_id = 1 AND (value LIKE "Классическое" OR value LIKE "Спортивное")
И у нас в результате запроса есть товары, где либо спортивный тип изделия, либо классический.
Но как сделать запрос, где надо учесть еще и то, что другой атрибут товара должен быть из какого-то множества? У нас ведь 1 запись содержит 1 атрибут и 1 его значение.
Такое выражение...
SELECT product_id FROM atribute_product WHERE (attribute_id = 1 AND (value LIKE "Классическое" OR value LIKE "Спортивное")) AND (attribute_id = 2 AND (value LIKE "Круглое" OR value LIKE "Овальное"))
...по мне лишено смысла...
Вот если бы это было не логическое И, а ИЛИ - там, конечно, проще. А конкретно в моем случае надо, чтобы было И.
Вообще, если мысль решить задачу тупо средствами php - просто сформировать несколько множеств и вычленить их пересечение. Но ведь явно же на SQL есть нормальное решение это задачи?
Думал о UNION запросах, но там именно объединение, вот если бы была бы такая же функция, которая именно пересечение делает...
В-общем, уважаемые специалисты, прошу растолковать, как такое решается.