Задать вопрос
@rinaz22

Как сортировать позиции в БД по заданным весам?

Всем привет! Есть некий интернет-магазин, где одинаковые товары, но с разной характеристикой(всего 1). Хочу сделать более или менее умную рекомендацию, чтобы в первых рядах было максимально нужное покупателю товар. Параметров для выбора наилучшего будет несколько и не только касаемо самого товара. Подумал тут подойдет "вес" каждого фильтра, но вот проблема, я никогда подобное не делал. В PHP я примерно понимаю как это можно сделать, но вот как это сделать в mysql при получении запроса? Также не стоит забывать про пагинацию
  • Вопрос задан
  • 116 просмотров
Подписаться 1 Средний 4 комментария
Решения вопроса 1
@alexalexes
Ну, если буквально понимать задачу, и у вас нужная характеристика имеет конкретное значение, то сортировать список нужно так:
select *
  from <таблица/соединенные таблицы для выборки товара> Tab1
where <условия фильтрации>
order by
case
  when Tab1.Приоритетное_свойство = :входная_приоритетная_характеристика
  then 1 -- запись с приоритетным свойством получит повышенное очко для первичной сортировки
  else 0 -- запись с неприоритетным свойством получит пониженное очко для первичной сортировки
end desc,
<Другие условия сортировки (по дате добавления, имени и т.д.)>

Если таких приоритетных характеристик несколько и они равнозначны, то можно сортировать по количеству подходящих под условие характеристик:
select *
  from <таблица/соединенные таблицы для выборки товара> Tab1
where <условия фильтрации>
order by
case
  when Tab1.Приоритетное_свойство_1 = :входная_приоритетная_характеристика_1
  then 1 -- запись с приоритетным свойством получит повышенное очко для первичной сортировки
  else 0 -- запись с неприоритетным свойством получит пониженное очко для первичной сортировки
end
+ -- очки приоритетов складываем
case
  when Tab1.Приоритетное_свойство_2 = :входная_приоритетная_характеристика_2
  then 1 -- запись с приоритетным свойством получит повышенное очко для первичной сортировки
  else 0 -- запись с неприоритетным свойством получит пониженное очко для первичной сортировки
end
+ 
-- ... и так далее все характеристики
 desc, -- 
<Другие условия сортировки (по дате добавления, имени и т.д.)>

Если приоритеты имеют иерархию, то через запятую в order by раскладываем case от важной характеристики, к менее важной.
select *
  from <таблица/соединенные таблицы для выборки товара> Tab1
where <условия фильтрации>
order by
case
  when Tab1.Приоритетное_свойство_1 = :входная_приоритетная_характеристика_1
  then 1 -- запись с приоритетным свойством получит повышенное очко для первичной сортировки
  else 0 -- запись с неприоритетным свойством получит пониженное очко для первичной сортировки
end desc, -- эта более важная характеристика
case
  when Tab1.Приоритетное_свойство_2 = :входная_приоритетная_характеристика_2
  then 1 -- запись с приоритетным свойством получит повышенное очко для первичной сортировки
  else 0 -- запись с неприоритетным свойством получит пониженное очко для первичной сортировки
end desc, -- эта менее важная характеристика
-- ... и так далее все характеристики
<Другие условия сортировки (по дате добавления, имени и т.д.)>

Можно комбинировать подходы, если есть куча характеристик на одном уровне иерархии.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

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

Похожие вопросы