У меня проблема с запросом на фильтр продуктов веб-сайта eCommerce.
У меня есть модель данных EAV:
products [id, title....] attributes [id, name] attributes_entity [product_id, attribute_id, value_id] attributes_values [id, value]
Мой запрос:
SELECT products.id, products.title FROM products WHERE products.id IN ( SELECT attributes_entity.product_id FROM attributes_entity INNER JOIN attributes ON attributes_entity.attribute_id=attributes.id INNER JOIN attributes_values ON attributes_entity.value_id=attributes_values.id WHERE ( (attributes.name="Memory" AND attributes_values.value="16GB") >> AND (attributes.name="Color" AND attributes_values.value="Gold") ) ) AND products.category_id = :category_id
Проблема заключается в том, что когда я использую >> И между (подписями атрибутов.name = "Memory" AND attributes_values.value = "16GB"), я получаю 0 результатов, но когда я использую OR, это дает мне больше результатов, которые мне нужны. не имеет значения для этих 2 условий.
Например, когда я получаю запрос: «Память = 16 ГБ и цвет = черный». Я ожидаю получить iPhone 5 16BG Black, не все (золото, космос серый и т. Д.) IPhone с 16 ГБ
Я ищу пример запроса, желательно с описанием того, как он работает.
Привет, Антон
Ваш подзапрос должен выглядеть следующим образом:
SELECT attributes_entity.product_id FROM attributes_entity INNER JOIN attributes ON attributes_entity.attribute_id=attributes.id INNER JOIN attributes_values ON attributes_entity.value_id=attributes_values.id WHERE (attributes.name="Memory" AND attributes_values.value="16GB") OR (attributes.name="Color" AND attributes_values.value="Gold") GROUP BY attributes_entity.product_id HAVING COUNT(DISTINCT attributes.name)=2
это решение использует подзапрос GROUP BY. Вы должны использовать ИЛИ, потому что атрибут не может быть Памятью и Цветком одновременно в одной и той же строке, они могут быть истинными, но в разных строках. COUNT (DISTINCT attributes.name) подсчитывает числовые атрибуты, которые являются либо цветом, либо памятью, если это 2, тогда существует как минимум 1 строка, где первое условие истинно и 1 строка, где другая также истинна.