Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > PHP: Базы Данных > Подсчет фильтров


Автор: CruorVult 25.5.2011, 13:13
Котелок вообще не варит  smile 

есть таблица с товарами gds (для визуализации)

 id | name
--------------
 1  | Toshiba AC100-117
 2  | Acer Aspire One 
 3  | ASUS Eee

есть таблица с товарами filters (для визуализации)

 id | name
--------------
 1  | Toshiba
 2  | Acer
 3  | ASUS
.... | 

есть таблица gds_filters :
gds_id - товар изg ds
filter_id  - из filters

id   |    gds_id |    filter_id 
 1   |    1       |    1
 2   |    2       |    2
 3   |    3       |    3
 15 |    3       |    15
 14 |    2       |    17
 13 |    1       |    15

Мне нужно посчитать количество товаров по каждому фильтру.
Фильтры группированные, тоесть filter_id = 1,2,3 из одной группы, filter_id = 15,16,17 -  из другой

К примеру пришел фильтр (filter_id = 1) 
было

filter_id = 1 (1)
filter_id = 2 (1)
filter_id = 3 (1)

filter_id =15 (2)
filter_id =16 (0)
filter_id =17 (1)

должно посчитать

filter_id = 1 (1)
filter_id = 2 (1)
filter_id = 3 (1)

filter_id =15 (1)
filter_id =16 (0)
filter_id =17 (0)

Тоесть не смотря на то что filter_id = 1, в filter_id = 2, 3 количество остается таким же, т.к. они находятся в одной группе а вот filter_id = 15, 17 уменьшается.

распределение по группам уже готово, тоесть если пришли фильтры 1,2,17 то распределяется так (1,2) и (17)

Автор: CruorVult 26.5.2011, 09:47
ну что, предложений нету? 
а то вытаскивать всё скриптом пару тыщ записей и обрабатывать скриптом не оч...

Автор: CruorVult 26.5.2011, 10:18
вот придумал такое, если пришли фильтры 1 и 17
Код

SELECT count(*) as cnt, gf.filter_id  FROM gds_filters as gf
LEFT JOIN gds_filters AS gf1 ON gf1.gds_id = gf.gds_id
LEFT JOIN gds_filters AS gf2 ON gf2.gds_id = gf.gds_id
where 
(
    gf.filter_id in(1,2,3)  and 
    gf1.filter_id in (1,2,3) and 
    gf2.filter_id in(17)
) OR (
    gf.filter_id in(15,17,18) and 
    gf1.filter_id in(1) and 
    gf2.filter_id in(15,17,18)
)
group by gf.filter_id 

Автор: CruorVult 27.5.2011, 11:57
в вышеуказаном варианте работает не очень быстро....
когда в таблице gds_filters 35к записей то запрос выполняется 0.2-1.5 сек

Что никто раньше с фильтрами не сталкивался?

такое чувство что я общаюсь сам с собой smile  

Автор: patap 27.5.2011, 12:25
здается мне, что народ не может въехать, что такое группы и зачем оно, по крайней мере я ничего не понял: что там группируется, зачем, какие-то абстрактные группы, зачем их учитывать в запросе, ну и т.д.

чем не устроит такой запрос?
Код

SELECT filter_id, COUNT(*) FROM gds_filters WHERE filter_id IN (1,2,17) GROUP BY filter_id


Добавлено через 1 минуту и 35 секунд
пришло 3 фильтра с ид равными: 1, 2 и 17
взяли и посчитали сколько товаров относится к каждому из фильтров.

или я недогоняю что к чему ))

Автор: CruorVult 27.5.2011, 12:46
Есть у нас группа "Производитель":

Производитель (filter_id=1, filter_id=2, filter_id=3)
    ASUS (1) (filter_id=1)
    Acer (1) (filter_id=2)
    Toshiba (1) (filter_id=3)

есть группа "Тип"

Тип (filter_id=15, filter_id=17, filter_id=18)
   Tablet PC (0) (filter_id=18)
   Нетбук (2) (filter_id=15)
   Ноутбук (1) (filter_id=17)

К примеру пришел фильтр (filter_id = 1) и посчитало так:

Производитель 
    ASUS (1) (filter_id=1)
    Acer (1) (filter_id=2)
    Toshiba (1) (filter_id=3)
 

Тип
   Tablet PC (0) (filter_id=18)
   Нетбук (1) (filter_id=15)
   Ноутбук (0) (filter_id=17)

Его имеет только товар "ASUS Eee", значит посчитало 1. На остальные фильтры из этой группы пришедший фильтр не влияеет т.к. они находится в одной группе. 
С другими же группами происходит обыный подсчет. Фильтр "Нетбук" имеет 2 товара: ASUS Eee и Toshiba AC100-117. Но т.к. нам нужны товары только с фильтром "ASUS", то соответственно посчитало (1).

Автор: CruorVult 30.5.2011, 11:32
Можно тему отзеркалить в разделе Базы Данных -> MySQL. Может так кто-то поможет.

Автор: CruorVult 1.6.2011, 11:34
Сделал...
всем ГРОМНОЕ СПАСИБО! За идеи, за подсказки! Без ВАС бы не получилось smile 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)