Задавайте вопросы, мы ответим
Вы не зашли.
Всем доброго дня!
Нужна умная голова)
есть таблица с товарами 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
но он работает не совчем правильно и не достаточно быстро.
Неактивен
А где Вы описываете группы фильтров?
Неактивен
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 - название фильтра
Я данные отсюда вытягиваю другим запросом.
Неактивен
Вот еще добави к запросу некоторые условия. А то при наличии у одного товара нескольких фильтров из одной группы - подсчет не правильно работал. Теперь нормально, но скорость выполнения не очень радует.
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)
Неактивен
Тему можно закрывать!
Неактивен