powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Фильтрация и подсчет товаров для EAV
4 сообщений из 4, страница 1 из 1
Фильтрация и подсчет товаров для EAV
    #38383691
zion03
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Добрый вечер, гуру SQL, помогите идеей оптимизации подсчета товаров для фасеточного фильтра на EAV.
Пока есть такая идея http://sqlfiddle.com/#!2/72872/6 , но она очень фигово выглядит.

И пример запроса прямо сюда:

Код: sql
1.
2.
3.
SELECT p.product_id, pv.value_id, GROUP_CONCAT(pv.value_id) as value_ids FROM product p
INNER JOIN product_to_value pv ON (p.product_id = pv.product_id) GROUP BY product_id 
HAVING ( FIND_IN_SET( 10, value_ids ) >0 ) AND ( FIND_IN_SET( 6, value_ids ) >0 OR FIND_IN_SET( 8, value_ids ) >0 )



запрос выбирает все возможные продукты при существующей фильтрации: 10 - это значение option1 и 6,8- значения option2
...
Рейтинг: 0 / 0
Фильтрация и подсчет товаров для EAV
    #38383695
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
zion03,

Хм, впервые вижу, чтобы этот запрос писали через GROUP_CONCAT и FIND_IN_SET :)
Обычно его пишут через IN и GROUP BY ... HAVING COUNT(*)=...
...
Рейтинг: 0 / 0
Фильтрация и подсчет товаров для EAV
    #38383703
zion03
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
GROUP_CONCAT - это что первое в голову пришло. Как сделать выборку через GROUP BY ... HAVING COUNT(*)= понятно, а вот подсчет не очень.
Если не сложно, можно пример через GROUP BY ... HAVING COUNT(*)= к запросу выше. Основная проблема для понимания - это учет зависимостей уже установленных фильтров, должна быть логика

value_id IN (option_value1 or option_value1) AND pv.value_id IN (option_value2 or option_value2)

т. е. OR если value из одной опции и AND из другой/соседней опции
...
Рейтинг: 0 / 0
Фильтрация и подсчет товаров для EAV
    #38384252
zion03
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Второй вариант такой:
Код: sql
1.
2.
3.
4.
5.
6.
7.
SELECT product_id FROM product_to_value WHERE 
product_id IN 
(SELECT product_id FROM product_to_value WHERE value_id IN (6,8) GROUP BY product_id)
AND
product_id IN 
(SELECT product_id FROM product_to_value WHERE value_id IN (10) GROUP BY product_id )
GROUP BY product_id 



какой вариант лучше будет?
...
Рейтинг: 0 / 0
4 сообщений из 4, страница 1 из 1
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Фильтрация и подсчет товаров для EAV
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]