@mmka

Как реализовать фасетную фильтрацию?

Здравствуйте, я уже задавал этот вопрос, но ответа на него не получил, возможно не правильно вопрос ставил. Также перерыл этот форум и интернет, также нечего не нашел. Объясню, что мне нужно. Мне нужен обычный фильтр по товарам. Например: выбрал человек производителя отфильтровался товар по производителям, выбрал размер отфильтровался по размеру и если при этом был выбран производитель, то и по производителю и по размеру и так далее с цветом и прочими атрибутами. Понятное дело, некоторые свойства(или атрибуты) товара хранятся в отдельной таблице, а некоторые нет (например размер хранится там же где и товар, т.е не в отдельной таблица). Это не важно с этим я как нибудь сам разберусь. Я никогда раньше не реализовывал такие задачи. Мне нужны подсказки. Как это можно сделать? Существуют MYSQL запросы? Или что?
  • Вопрос задан
  • 3299 просмотров
Пригласить эксперта
Ответы на вопрос 6
evnuh
@evnuh
Поиск Гугл помог мне, впусти и ты его в свой дом
Просто берете книжку "Основы баз данных" и читаете, сразу все прояснится. Задавши этот вопрос вы сразу говорите, что вообще не понимаете что такое реляционные базы данных и как с ними работать, и пытаетесь одним вопросом на тостере познать дзен. Сначала читайте - потом спрашивайте то, чего не поняли.
Ответ написан
Комментировать
@theaidem
Посмотрите в сторону Apache Solr
Ответ написан
Комментировать
Rsa97
@Rsa97
Для правильного вопроса надо знать половину ответа
Просто составляете запрос из всех указанных пользователем параметров, не забывая их тщательно контролировать.
SELECT * FROM `stock` 
    WHERE `manufacturer` = {$manufacturer }
      AND `size` BETWEEN {$minSize} AND {$maxSize}
      AND `color` = {$color}
Ответ написан
@Vampiro
Для решения задачи, необходимо определиться с терминами.
Пусть "пользователь выбрал производителя" означает выбор из некоего select в форме поиска.
Пусть "пользователь выбрал размер" - это числовое значение в поле формы.
Пусть "отфильтровался товар" - это результат показываемый пользователю после нажатия кнопки "Поиск".
Тогда на стороне сервера в php можно сделать примерно так:
$where[]=1; <- это чтобы фильтровать по всем товарам и не сломать при этом запрос.

if (isset($_GET['madeby']))
{
если мы что-то выбрали в списке производителей...
$where[]="t.madeby='".(int)$_GET['madeby']."'";
}
if (isset($_GET['sizeHi']))
{
если мы что-то указали в размерах - то добавляем еще одно условие, пускай оно в джойн-таблице.
$where[]="parenttable.size<='".(int)$_GET['sizeHi']."'";
}
формируем запрос, собирая все условия в одну строку через "and"
$request = "select * from sometable t left join parenttable on (parenttable.parent_id=t.id) where ". implode(" and ",$where);
и смотрим что получилось.
var_dump($request);
запрос выполняем, результат показываем.

Это не самый оптимальный, но самый простой вариант который должен бы направить вас в "нужную сторону мысли"
Ответ написан
Комментировать
alekciy
@alekciy
Вёбных дел мастер
Указанная логика фильтрации, это не фасетчатый фильтр. Объясняю на примере одежды. Фасетка это:
1) Пользователь в наборе фильтров выбрал размер Х одежды.
2) В связанных фильтрах, например цвет, скрылись (или стали неактивными) цвета для которых нет размера Х.
Ответ написан
Комментировать
walkman7
@walkman7
Используйте elasticsearch
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы