Выбирайте продукты по нескольким атрибутам, используя AND вместо OR, конкатенатор, модель данных EAV

У меня проблема с запросом на фильтр продуктов веб-сайта 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 строка, где другая также истинна.