Модераторы: skyboy

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> умный фильтр, Отсеять ненужные фильтры 
V
    Опции темы
yukodev
  Дата 22.11.2013, 18:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 24
Регистрация: 29.6.2012

Репутация: нет
Всего: нет



В конце концов мы выбираем по (частота_обновления in (200,400) and Формат_телевизора in (21:9,16:9)) - это да все верно.

Фильтрация товаров работает у меня правильно уже 3-ма способами smile. Пока не решимая для меня задача это фильтрация фильтров - отсеять фильтры которые после выборки будут ненужны и будут возвращать 0 товаров(чтоб юзер не тыкал по 100+ опциям и в половине случаев получал 0 товаров).

Zloxa,  У меня уже голова не варит, не Вы первый кто не может понять что конкретно я хочу, не умею доходчиво объяснять smile. Позже попробую объяснить доступней.

Спасибо Вам что попытались помочь, как приведу мысли в порядок может еще продолжим дискуссию. 
PM MAIL   Вверх
Zloxa
Дата 22.11.2013, 23:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Чо?
****


Профиль
Группа: Завсегдатай
Сообщений: 3473
Регистрация: 12.9.2008

Репутация: 33
Всего: 161



del

Это сообщение отредактировал(а) Zloxa - 22.11.2013, 23:07


--------------------
Достоверно известно, что 89% людей доверяют статистике взятой с потолка smile
PM   Вверх
Zloxa
Дата 23.11.2013, 00:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Чо?
****


Профиль
Группа: Завсегдатай
Сообщений: 3473
Регистрация: 12.9.2008

Репутация: 33
Всего: 161



оно?

исходные данные
Код

with param_values as( 
select 'продукт1' product,'частота' param_id,'200' param_value  from dual
union all select 'продукт2' product,'частота' param_id,'200' param_value  from dual
union all select 'продукт3' product,'частота' param_id,'400' param_value  from dual
union all select 'продукт4' product,'частота' param_id,'400' param_value  from dual
union all select 'продукт5' product,'частота' param_id,'300' param_value  from dual
union all select 'продукт1' product,'формат' param_id,'21:9' param_value  from dual
union all select 'продукт3' product,'формат' param_id,'21:9' param_value  from dual
union all select 'продукт2' product,'формат' param_id,'16:9' param_value  from dual
union all select 'продукт4' product,'формат' param_id,'16:9' param_value  from dual
)

без фильтров
Код

 12  select p1.param_id,p1.param_value
 13         ,count(case when 1=1
 14  --                      and (p2.param_value in ('200') or p1.param_id = 'частота')
 15  --                      and (p3.param_value = '16:9'  or p1.param_id = 'формат')
 16                     then p1.product
 17                  end
 18               ) cnt
 19  from param_values p1
 20  --left join param_values p2 on p1.product = p2.product and p2.param_id ='частота'
 21  --left join param_values p3 on p1.product = p3.product and p3.param_id ='формат'
 22  group by p1.param_id,p1.param_value
 23  order by 1,2
 24  /
PARAM_ID PARAM_VALUE        CNT
-------- ----------- ----------
формат   16:9                 2
формат   21:9                 2
частота  200                  2
частота  300                  1
частота  400                  2

добавляем фильтр 200гц
Код

 12  select p1.param_id,p1.param_value
 13         ,count(case when 1=1
 14                        and (p2.param_value in ('200') or p1.param_id = 'частота')
 15  --                      and (p3.param_value = '16:9'  or p1.param_id = 'формат')
 16                     then p1.product
 17                  end
 18               ) cnt
 19  from param_values p1
 20  left join param_values p2 on p1.product = p2.product and p2.param_id ='частота'
 21  --left join param_values p3 on p1.product = p3.product and p3.param_id ='формат'
 22  group by p1.param_id,p1.param_value
 23  order by 1,2
 24  /
PARAM_ID PARAM_VALUE        CNT
-------- ----------- ----------
формат   16:9                 1
формат   21:9                 1
частота  200                  2
частота  300                  1
частота  400                  2

добавляем фильтр 16:9
Код

 12  select p1.param_id,p1.param_value
 13         ,count(case when 1=1
 14                        and (p2.param_value in ('200') or p1.param_id = 'частота')
 15                        and (p3.param_value = '16:9'  or p1.param_id = 'формат')
 16                     then p1.product
 17                  end
 18               ) cnt
 19  from param_values p1
 20  left join param_values p2 on p1.product = p2.product and p2.param_id ='частота'
 21  left join param_values p3 on p1.product = p3.product and p3.param_id ='формат'
 22  group by p1.param_id,p1.param_value
 23  order by 1,2;
PARAM_ID PARAM_VALUE        CNT
-------- ----------- ----------
формат   16:9                 1
формат   21:9                 1
частота  200                  1
частота  300                  0
частота  400                  1


похоже?


--------------------
Достоверно известно, что 89% людей доверяют статистике взятой с потолка smile
PM   Вверх
yukodev
Дата 24.11.2013, 11:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 24
Регистрация: 29.6.2012

Репутация: нет
Всего: нет



Zloxa,  Кажется оно!  Подгоню под рабочую базу протестирую и отпишу.............
PM MAIL   Вверх
yukodev
Дата 24.11.2013, 20:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 24
Регистрация: 29.6.2012

Репутация: нет
Всего: нет



Один баг нашел:
Если один товар имеет например все(или несколько) опции параметра а не только одну то неправильно пересчитывает количество если отметить одну из этих опций опций:
До выбора опции:
user posted image
Посчитано правильно при выборе будет 35 товаров.
После выбора опции:
user posted image


Такое происходит только если товар имеет несколько опций одного параметра, если у товаров одна опция одного параметра то все верно считает.
В данном примере параметр Вариант установки двери у товаров и Раздвижная  и Распашная  и Складная 
 
Вот запрос я чуть поменял, может что то не так сделал:
Код

 SELECT p1.parameter_id,p1.parameters_value_id,pr.name as pname, pvs.value as value, pvs.name_trans 
,COUNT(
CASE WHEN 1=1 
AND (
p2.parameters_value_id IN ('789') 
OR p1.parameter_id = '59'

THEN p1.product_id END 
) total 
FROM products_parameters p1 JOIN products p ON p1.product_id = p.id and p.watch=1 
and p.breadcrumb REGEXP '^21-|-21-|-21-${1}' 
LEFT JOIN parameters pr ON p1.parameter_id = pr.id 
LEFT JOIN parameters_values pvs ON p1.parameters_value_id = pvs.id 
LEFT JOIN products_parameters p2 ON p1.product_id = p2.product_id AND p2.parameter_id ='59' 
GROUP BY p1.parameter_id,p1.parameters_value_id 
ORDER BY p1.parameter_id,value


Это сообщение отредактировал(а) yukodev - 24.11.2013, 20:55
PM MAIL   Вверх
Zloxa
Дата 24.11.2013, 20:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Чо?
****


Профиль
Группа: Завсегдатай
Сообщений: 3473
Регистрация: 12.9.2008

Репутация: 33
Всего: 161



Цитата(yukodev @  24.11.2013,  21:49 Найти цитируемый пост)
Такое происходит только если товар имеет несколько опций одного параметра

Код

count(distinct product)



--------------------
Достоверно известно, что 89% людей доверяют статистике взятой с потолка smile
PM   Вверх
yukodev
Дата 24.11.2013, 21:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 24
Регистрация: 29.6.2012

Репутация: нет
Всего: нет



Zloxa,  Помогло:
Код

COUNT(distinct CASE WHEN 1=1............

Спасибо!, еще потестирую завтра отпишу...
PM MAIL   Вверх
yukodev
Дата 25.11.2013, 09:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 24
Регистрация: 29.6.2012

Репутация: нет
Всего: нет



Zloxa,  не нашел больше багов. Все отлично огромное Вам спасибо, сам вряд ли решил бы эту задачу!
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | MySQL | Следующая тема »


 




[ Время генерации скрипта: 0.1147 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.