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

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

Всем привет! Есть некий интернет-магазин, где одинаковые товары, но с разной характеристикой(всего 1). Хочу сделать более или менее умную рекомендацию, чтобы в первых рядах было максимально нужное покупателю товар. Параметров для выбора наилучшего будет несколько и не только касаемо самого товара. Подумал тут подойдет "вес" каждого фильтра, но вот проблема, я никогда подобное не делал. В PHP я примерно понимаю как это можно сделать, но вот как это сделать в mysql при получении запроса? Также не стоит забывать про пагинацию
  • Вопрос задан
  • 134 просмотра
Подписаться 1 Средний 4 комментария
Помогут разобраться в теме Все курсы
  • Skillbox
    Веб-разработчик на PHP
    9 месяцев
    Далее
  • Хекслет
    PHP-разработчик
    10 месяцев
    Далее
  • Нетология
    Веб-разработчик с нуля: профессия с выбором специализации
    14 месяцев
    Далее
Решения вопроса 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, -- эта менее важная характеристика
-- ... и так далее все характеристики
<Другие условия сортировки (по дате добавления, имени и т.д.)>

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

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

Похожие вопросы
FoodSoul Калининград
от 180 000 до 250 000 ₽
IT-Spirit Москва
от 230 000 до 320 000 ₽
от 200 000 до 290 000 ₽