| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > MySQL > умный фильтр |
| Автор: yukodev 9.11.2013, 22:22 | ||
| Здравствуйте. Фильтры для интернет магазина. products(id,name.....) parameters (id,name) parameters_values (id,parameter_id,value) products_parameters(product_id,parameter_id,parameters_vallue_id) Сам механизм фильтрации реализован. Вот запрос (выбраны значения трех параметров)
Не могу понять как реализовать отсеивание ненужных фильтров. Например кликнули по параметру размер xxl - фильтр все правильно отфильтровал но также нужно не выводить фильтры по выбору которого не будет найден хоть один результат. Пример market.yandex.ua/guru.xml?CMD=-RR=9,0,0,0-VIS=70-CAT_ID=432460-EXC=1-PG=10&hid=91013 - после выбора фильтра ненужные отсеиваются Подскажите идею....... |
| Автор: yukodev 12.11.2013, 12:01 | ||||
| Наверно плохо объяснил. Есть структура фильтры-товары: http://s2.ipicture.ru/Gallery/Viewfull/33686308.html Запрос на фильтрацию товаров - выбрано 4 значения 3-х параметров
В фильтрах я выводил все параметры и выбирая параметры товары правильно фильтровались, но были случаи когда набор фильтров не находил товаров и пользователь получал сообщение "по вашему запросу ничего не найдено". Стала задача во время филтрацbи также отсеять фильтра которые не найдут хотя бы один результат. Долго думал, получилось сделать вариант при котором в фильтрах будут выводиться только те, параметры и их значения, которые есть в уже отфильтрованых товаров:
Этот запрос дает нам отфильтрованый набор параметров который неможет привести в дальнейшем к сообщению "по вашему запросу ничего не найдено". Но отсеялись часть фильтров по выбору которых налшись бы еще товары. Например фильтр: Тип -девочка -мальчик -новорожденный Размер -1 -2 -3 ..... В последнем случаи отсейки фильтров - при выборе Типа "девочка" останутся фильтра Тип -девочка -мальчик -новорожденный Размер -1 -2 -3 Но мальчик и новорожденный должны остаться потому, что они добавят результатов. Помогите оптимизировать отсеивание фильтров! 250wmr тому кто сможет решить задачу (торг уместен) |
| Автор: Akina 12.11.2013, 12:20 |
| Уж коли кросс-постишь - то давай ссылки на другие форумы. А коли готов оплачивать работу - так обращайся сразу во фриланс. |
| Автор: yukodev 21.11.2013, 22:48 | ||
Поменял запрос результат тот же, может идеи у кого то есть?
|
| Автор: yukodev 22.11.2013, 11:00 |
| Кросс-пост: http://sqlinfo.ru/forum/viewtopic.php?pid=38218 |
| Автор: Zloxa 22.11.2013, 12:16 |
Завязывайте с EAV |
| Автор: yukodev 22.11.2013, 12:23 |
А как решить задачу умного фильтра? Пример: _http:filter.kombox.ru/tv/ на чистом mysql, без solar и прочего которое не работает на обычном хостинге без выделенного сервера |
| Автор: yukodev 22.11.2013, 13:32 | ||||
Так?..... Не помогло - та же выдача получилась. |
| Автор: Zloxa 22.11.2013, 13:49 | ||||||
ясен пень. Я же дословно перевел то что вы говорите. А говорите вы странные вещи, тяжело потдающиеся осмысленю. попробую включить телепатию и предложить вам
Возможно вам следует просто ранжировать выдачу выставить вперед те записи, которые имеют большее попадание в критерии фильтра по "или"? если это не катит, покажите на таком примере что вы ожидаете получить.
Что, по вашему, мнению на этих данных должен вернуть ваш запрос:
|
| Автор: yukodev 22.11.2013, 15:50 | ||||
Это запрос возвращает все актуальные значения параметров для выбранных товаров упуская те которые могут добавить результатов в выборку товаров Альтернативный запрос который дает тод же результат :
|
| Автор: Zloxa 22.11.2013, 17:12 | ||
Вы не мудрите, лучше пальцем покажите перечислите позиции, которые по вашему мнению должны вернуться. |
| Автор: yukodev 22.11.2013, 17:32 | ||||||||||||||||
Данные:
Первая выборка - входящая опция "опция_1_1" параметра "Параметр1":
Результат:
Ожидаемый результат:
Потенциальный рез.
То что опция выпала это понятно - выпала потому, что отфильтровались все опции которых нет в наборе продуктов полученых таким запросом. Нужно оптимизировать запрос так чтоб он не откидал "потенциально" нужные опции. Живой пример работы поожого фильтра: filter.kombox.ru/tv/ ---------------------------Пример 2----------------------- Выборка опций 2-го параметра:
Результат:
Ожидаемый результат:
Добавлено @ 17:34 Еще словами как это должно работать: 1) Фиксируем опцию одного параметра, например "опция_1_1", тогда мы должны выбрать те опции, которые сочитаются с опция_1_1 других параметров а также все остальные опции первого параметра (которому пренадлежит опция_1_1) 2)Фиксируем два параметра, например, "опция_1_1" + "опция_2_1" (при этом опция_2_1 доступна для выбора так как она сочитается с опция_1_1 также незабываем что это опции разных параметров) тогда мы должны выбрать опции которые сочитаются с опция_1_1 первого параметра и опция_2_1 второго параметра а также остальные опции второго параметра которые сочитаются с опция_1_1 первого параметра 3) Фиксируем 2 опции 1-го параметра опция_1_1(230 товаров), опция_1_2 (120 товаров) получаем 350 товаров(для примера). Дальше во втором параметре нам допустимы опции которые сочитаются и с опция_1_1 и с опция_1_2. Например опция_2_1 сочитается с опция_1_1 а опция_2_2 сочитается с опцией_1_2. и Если наш следующий выбор будет опция_2_1 то все товары опции_1_2 не покажутся а сама опция станет неактивной(заблокированной) но будет отмечена(на результат не повлеяет но если мы решим еще выбрать опция_2_2 то она опция_1_2 разблокируется) ------------------------------------------ Пример для понимания логики: _http://filter.kombox.ru/tv/ Параметр частота обновления выбираем 200 и 400 Гц. Дальше параметр Формат телевизора выбираем 21:9 - 400Гц заблокировалась. Дальше добавляем Формат 16:9 - 400Гц разблокировалась. Вот такая логика зависимости. |
| Автор: Zloxa 22.11.2013, 17:43 |
| yukodev, и все таки я тупой. Я не понимаю чего вы мне столькобукв понаписали, зачем вы мне пишите запросы, которые делают не то что вы хотите, я не понимаю что у вас откуда выпадает и чем выпавшее отличается от выбранного. Я привел пример данных. Просто перечислите мне те товары, которые должны отобраться из того набора. |
| Автор: Zloxa 22.11.2013, 18:05 |
В конце концов мы выбираем по (частота_обновления in (200,400) and Формат_телевизора in (21:9,16:9)) Для того чтобы посчитать количество по опциям, после применнения фильтра, группируемся собственно по типу опции и считаем count(disticnt товар) |
| Автор: yukodev 22.11.2013, 18:13 |
| В конце концов мы выбираем по (частота_обновления in (200,400) and Формат_телевизора in (21:9,16:9)) - это да все верно. Фильтрация товаров работает у меня правильно уже 3-ма способами Zloxa, У меня уже голова не варит, не Вы первый кто не может понять что конкретно я хочу, не умею доходчиво объяснять Спасибо Вам что попытались помочь, как приведу мысли в порядок может еще продолжим дискуссию. |
| Автор: Zloxa 22.11.2013, 23:05 |
| del |
| Автор: Zloxa 23.11.2013, 00:41 | ||||||||
| оно? исходные данные
без фильтров
добавляем фильтр 200гц
добавляем фильтр 16:9
похоже? |
| Автор: yukodev 24.11.2013, 11:42 |
| Zloxa, Кажется оно! Подгоню под рабочую базу протестирую и отпишу............. |
| Автор: yukodev 24.11.2013, 20:49 | ||
| Один баг нашел: Если один товар имеет например все(или несколько) опции параметра а не только одну то неправильно пересчитывает количество если отметить одну из этих опций опций: До выбора опции: ![]() Посчитано правильно при выборе будет 35 товаров. После выбора опции: ![]() Такое происходит только если товар имеет несколько опций одного параметра, если у товаров одна опция одного параметра то все верно считает. В данном примере параметр Вариант установки двери у товаров и Раздвижная и Распашная и Складная Вот запрос я чуть поменял, может что то не так сделал:
|
| Автор: Zloxa 24.11.2013, 20:53 | ||||
|
| Автор: yukodev 24.11.2013, 21:01 | ||
Zloxa, Помогло:
Спасибо!, еще потестирую завтра отпишу... |
| Автор: yukodev 25.11.2013, 09:43 |
| Zloxa, не нашел больше багов. Все отлично огромное Вам спасибо, сам вряд ли решил бы эту задачу! |