Извлечение товаров, соответствующих нескольким фильтрам атрибутов (значение атрибута сущности) - PullRequest
0 голосов
/ 19 октября 2018

Я пытаюсь добавить возможность добавления нескольких фильтров при получении продуктов из базы данных, которая имеет базовую модель сущности-атрибута-значения.Фильтры основаны на значениях атрибутов, таких как:

  • Цвета: зеленый, красный
  • Размеры: маленький, большой

У меня нет проблем с однимфильтр, но я не знаю, как подойти к нескольким фильтрам одновременно.


ПРИМЕРНЫЕ ДАННЫЕ : (сокращенная версия)

SQL-файл сэтот пример структура и данные

Таблица продукты :

id name
1  jacket
2  shirt

Таблица product_variants :

id product_id
1  1
2  2
3  2

Таблица атрибуты :

id name
1  colors
2  sizes

Таблица attribute_value :

id attribute_id value
1  1            green
2  1            red
3  2            small
4  2            large

Таблица variable_details :

id product_variant_id attribute_value_id
1  1                  3                    (jacket - small)
2  2                  1                    (shirt - green)
3  2                  3                    (shirt - small)
4  3                  1                    (shirt - green)
5  3                  4                    (shirt - large)

Для этого примера, три варианта будут:

  • Куртка (маленькая)
  • Рубашка (зеленая и маленькая)
  • Рубашка (зеленый и большой)

ЦЕЛЬ :

Я хочу передать идентификаторы для значений атрибута и получить продукты, соответствующие ВСЕМ указанным значениям атрибутаНапример:

products.php?attr=1&4

Если fВытравите продукты зеленого (1) и большого (4), например, только третий вариант соответствует критериям, поэтому желаемый результат будет:

product_id product_desc
2          shirt

ЧТО I 'VE TRIED :

Не думаю, что это сильно поможет, но у меня есть это для одного атрибута:

products.php?attr=1

Должно дать что-нибудь, что имеет значение атрибута зеленый(1):

SELECT products.id, products.desc, attribute_value.value FROM products
LEFT JOIN product_variants ON products.id = product_variants.product_id
LEFT JOIN variant_details ON variant_details.product_variant_id = product_variants.id
LEFT JOIN attribute_value ON attribute_value.id = variant_details.attribute_value_id
WHERE attribute_value.id = 1
GROUP BY products.id

Проблема в том, что перед предложением WHERE это то, что он производит:

id name    value
1  jacket  small
2  shirt   green
2  shirt   small
2  shirt   green
2  shirt   large

, а я нетзнать, как фильтровать те строки, которые имеют столбец значений, как зеленый, так и большой, например.Я думаю, что подход, который я использую для запроса, неправильный.

Любая помощь будет признательна.

1 Ответ

0 голосов
/ 19 октября 2018

Я смог заставить его работать способом с помощью следующего запроса:

SELECT products.id, products.desc FROM products
WHERE EXISTS 
(
SELECT * FROM product_variants
LEFT JOIN variant_details ON variant_details.product_variant_id = product_variants.id
LEFT JOIN attribute_value ON attribute_value.id = variant_details.attribute_value_id
WHERE product_variants.product_id = products.id AND attribute_value.id = 1
)
AND EXISTS
(
SELECT * FROM product_variants
LEFT JOIN variant_details ON variant_details.product_variant_id = product_variants.id
LEFT JOIN attribute_value ON attribute_value.id = variant_details.attribute_value_id
WHERE product_variants.product_id = products.id AND attribute_value.id = 4
)

Я говорю способом , потому что он вернет все продуктыкоторые имеют каждый запрошенный атрибут в один или несколько его вариантов .

Пример :

Возьмите один продукт,рубашка, которая поставляется в двух цветах и ​​двух размерах, ее вариантами могут быть:

  • рубашка (зелёная и маленькая)
  • рубашка (зелёная и большая)
  • рубашка(красный и маленький)

Обратите внимание на отсутствие красного и большого варианта.Если я выполню приведенный выше запрос с красным и большим, он все равно будет соответствовать этому продукту, потому что один из его вариантов имеет «красный», а другой - «большой».

Я решил добавить это как ответ вместо редактированияпотому что он выполняет задачу сопоставления продукта с двумя (или более) атрибутами, но я все же хотел бы увидеть ответ, в котором результат ограничен для соответствия одному варианту продукта или, возможно, другого способа достижения этого.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...