@goran1301
веб программист

Как используя mySQL отфильтровать товары по EAV свойствам, если указано больше одного свойства?

Делаю фильтр товаров по свойствам, приходит к тому, что пишу дополнительное условие (код атрибута равен X и значение атрибута = Y И код другого атрибута из той же таблицы равен Z и значение атрибута равно I)
(
AND ((`lists_items`.`slug`='biglist') AND (`parameters`.`slug`='list-size'))
AND - !его заменял на OR
((`lists_items`.`slug` IN ('black', 'green')) AND (`parameters`.`slug`='tea-type'))
)

где lists_items - это элементы списка, из которых выбираются значения свойств
parameters - это сущность для параметра товара
products_parameters - это сущность для значений параметра товара, здесь связывается возможное значение атрибута из lists_items и товар из products
products - таблица с товарами

*Если заменяю отмеченный AND на OR - находит Или товары по одному свойству, или по другому. Но с AND не находит НИЧЕГО. Хотя есть товары, которые соответствуют обоим критериям - то есть есть товары, у которых имеются оба свойства и одно из переданных значений.

Весь запрос ниже (biglist - значение свойства list-size, а black и green - значения параметра tea-type).
SELECT * FROM `products` LEFT JOIN `sub_sections` ON `products`.`subsection_id` = `sub_sections`.`id`
 LEFT JOIN `products_parameters` ON `products`.`id` = `products_parameters`.`product_id`
 LEFT JOIN `lists_items` ON `products_parameters`.`list_item_id` = `lists_items`.`id` 
LEFT JOIN `parameters` ON `products_parameters`.`parameter_id` = `parameters`.`id`
 WHERE (`sub_sections`.`slug`='first_sub')
 AND (((`lists_items`.`slug`='biglist') AND (`parameters`.`slug`='list-size')) 
AND ((`lists_items`.`slug` IN ('black', 'green')) AND (`parameters`.`slug`='tea-type')))


Пишу на Yii2, поэтому объяснение сразу в ActiveQuery - тоже очень поможет.

Если AND, котрый я указал заменить на OR - находит верно - то есть или свойство такое-то имеет значение такое-то, или совпадает иное свойство с иным значением. Но мне нужно, чтобы совпадения были по всем свойствам, поэтому пишу AND. И вот тут у меня всегда пустой результат. Отчего это может быть? Какой запрос в итоге нужен? Убил на это весь день.
  • Вопрос задан
  • 1039 просмотров
Решения вопроса 1
@goran1301 Автор вопроса
веб программист
ИТОГ

Решил вот таким запросом
SELECT p.*, po1.slug 'P1', po2.slug 'P2', prop1.slug 'S1', prop2.slug 'S2' 
 
FROM products p       
 
INNER JOIN products_parameters p2o1 ON p.id = p2o1.product_id
INNER JOIN lists_items po1  ON po1.id = p2o1.list_item_id
LEFT JOIN parameters prop1 ON prop1.id = p2o1.parameter_id
 
INNER JOIN products_parameters p2o2 ON p.id = p2o2.product_id
INNER JOIN lists_items po2  ON po2.id = p2o2.list_item_id
LEFT JOIN parameters prop2 ON prop2.id = p2o2.parameter_id
WHERE
(`po1`.`slug` IN ('black', 'green') AND `prop1`.`slug` = 'tea-type') AND (`po2`.`slug`='biglist' AND `prop2`.`slug` = 'list-size')


Не знаю насколько это корявый метод. Теперь буду работать над переносом этого кода в Yii2 видимо от ActiveQuery придется отказаться и формаировать через Query.
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
webinar
@webinar Куратор тега Yii
Учим yii: https://youtu.be/-WRMlGHLgRg
1. Объяснили Вы весело.
2. Для фильтров проще сделать SearchModel тем более что ее можно сгенерировать через GII, получить в результате готовое решение, к которому останется добавить join
3. Вот что стоит почитать:
www.yiiframework.com/wiki/653/displaying-sorting-a...
https://nix-tips.ru/yii2-sortirovka-i-filtr-gridvi...
www.yiiframework.com/doc-2.0/guide-db-active-recor...

После прочтения у Вас должны появится уже конкретные вопросы, на них с удовольствием отвечу.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы