Как правильно сделать фильтр для интернет магазина?
Добрый день
Имеются следующее таблицы:
Таблица ELEMENTS,которая содержит название и описание товара и т.д.
Таблица OFFERS в которой содержатся торговые предложения: element_id, title, price и т.д. (у товара может быть несолько вариантов с разными ценами).
Таблица FEATURES содержит свойства: id, title.
Таблица ELEMENTS_FEATURES, которая содержит значения свойств элемента: element_id, feature_id, value.
Как правильно соединить таблицы чтобы можно было организовать фильтр товаров по нескольким свойствам сразу?
Получается нужно соединить ELEMENTS и ELEMENTS_FEATURES, но у меня получился только поиск по одному свойству.
Может значение свойств лучше хранить в виде текста в таблице ELEMENTS, и выполнять поиск через регулярное выражение?
SELECT * FROM ELEMENTS LEFT JOIN ELEMENTS_FEATURES ON ELEMENTS.ID = ELEMENTS_FEATURES.ELEMENT_ID JOIN FEATURES ON FEATURES.ID = ELEMENTS_FEATURES.FEATURES.ID WHERE <УСЛОВИЯ ПОИСКА>
Такой вариант пробовал, но получается работать только с 1 свойством:
SELECT *
FROM eshop_products
LEFT JOIN eshop_products_features ON eshop_products.id = eshop_products_features.product_id
WHERE eshop_products_features.feature_id = '2' and eshop_products_features.value = 'MacOS X'
and eshop_products_features.feature_id = '1' and eshop_products_features.value = 'Ноутбук'
Если два условия - выдвет пустой результат, может запрос не правильно составил?
SELECT *
FROM eshop_products
LEFT JOIN eshop_products_features ON eshop_products.id = eshop_products_features.product_id
WHERE eshop_products_features.value = 'MacOS X' OR
eshop_products_features.value = 'Ноутбук'
feature_id = '1' - свойство "Тип"
feature_id = '2' - свойство "Операционная система"
Нам нужно найти Тип: Ноутбук и Операционная система: MacOS X
Ваш запрос работает с условием или, а если поставить условие и то так же пустой результат
SELECT *
FROM eshop_products
LEFT JOIN eshop_products_features ON eshop_products.id = eshop_products_features.product_id
JOIN eshop_features ON eshop_products_features.feature_id=eshop_features.id
WHERE (eshop_features.id='1' OR eshop_features.id=2) and (eshop_products_features.value="MacOS X" or eshop_products_features.value="Ноутбук") GROUP BY eshop_products.id
SELECT *
FROM eshop_products
LEFT JOIN eshop_products_features FPV0 ON FPV0.product_id = eshop_products.id
LEFT JOIN eshop_products_features FPV1 ON FPV1.product_id = eshop_products.id
WHERE (
FPV0.feature_id = '2'
AND FPV0.value = 'MacOS X'
)
AND (
FPV1.feature_id = '1'
AND FPV1.value = 'Ноутбук'
)
Вот так работает, только что лучше использовать INNER JOIN или LEFT JOIN?