SQLinfo.ru - Все о MySQL

Форум пользователей MySQL

Задавайте вопросы, мы ответим

Вы не зашли.

#1 30.05.2011 12:22:31

CruorVult
Участник
Зарегистрирован: 30.05.2011
Сообщений: 4

Подсчет фильтров

Всем доброго дня!

Нужна умная голова)

есть таблица с товарами 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=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)

К примеру пришел фильтр "ASUS" (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).

вот придумал такое, если пришли фильтры 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

но он работает не совчем правильно и не достаточно быстро.

Неактивен

 

#2 30.05.2011 13:27:05

paulus
Администратор
MySQL Authorized Developer and DBA
Зарегистрирован: 22.01.2007
Сообщений: 6757

Re: Подсчет фильтров

А где Вы описываете группы фильтров?

Неактивен

 

#3 30.05.2011 13:36:57

CruorVult
Участник
Зарегистрирован: 30.05.2011
Сообщений: 4

Re: Подсчет фильтров

paulus написал:

А где Вы описываете группы фильтров?

CREATE TABLE `filters` (
  `id` smallint(6) NOT NULL AUTO_INCREMENT, 
  `filter_name_id` smallint(6) NOT NULL,
  `filter_value_id` smallint(6) NOT NULL DEFAULT '0', 
  PRIMARY KEY (`id`),
  KEY `filter_name_id` (`filter_name_id`),
  KEY `filter_value_id` (`filter_value_id`)
) ENGINE=MyISAM  DEFAULT CHARSET=cp1251 AUTO_INCREMENT=0 ;

filter_name_id - название группы
filter_value_id - название фильтра

Я данные отсюда вытягиваю другим запросом.

Неактивен

 

#4 30.05.2011 13:40:45

CruorVult
Участник
Зарегистрирован: 30.05.2011
Сообщений: 4

Re: Подсчет фильтров

Вот еще добави к запросу некоторые условия. А то при наличии у одного товара нескольких фильтров из одной группы - подсчет не правильно работал. Теперь нормально, но скорость выполнения не очень радует.

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) and
    gf.filter_id = gf1.filter_id
) OR (
    gf.filter_id in(15,17,18) and
    gf1.filter_id in(1) and
    gf2.filter_id in(15,17,18) and
    gf.filter_id = gf2.filter_id
)
group by gf.filter_id

Отредактированно CruorVult (30.05.2011 13:41:44)

Неактивен

 

#5 01.06.2011 12:37:46

CruorVult
Участник
Зарегистрирован: 30.05.2011
Сообщений: 4

Re: Подсчет фильтров

Тему можно закрывать!

Неактивен

 

Board footer

Работает на PunBB
© Copyright 2002–2008 Rickard Andersson