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

Ссылка скопирована
1 ответ

Всем привет! Есть некий интернет-магазин, где одинаковые товары, но с разной характеристикой(всего 1). Хочу сделать более или менее умную рекомендацию, чтобы в первых рядах было максимально нужное покупателю товар. Параметров для выбора наилучшего будет несколько и не только касаемо самого товара. Подумал тут подойдет "вес" каждого фильтра, но вот проблема, я никогда подобное не делал. В PHP я примерно понимаю как это можно сделать, но вот как это сделать в mysql при получении запроса? Также не стоит забывать про пагинацию

Дополнительно:

Задавая столь общий вопрос, можно получить только весьма общий ответ:

Составьте выражение, которое превратит кучу значений и их весов в одно общее значение (комбинированный вес), и используйте его в выражении сортировки.

  • Akina, Тогда это же получиться все общая сортировка. А мне нужно индивидуальная под каждого покупателя. Учитывать их предыдущие покупки и т.п. Конечно я жду готово года. Мне бы идею как это реализовать или примеры подобных
  • rinaz22, распишите как User Story. Вот есть 5 товаров, характеристика X принимает значения N1,..N5 ( тут должны быть конкретные значения, для примера). У первого покупателя вот такой набор весов: Y11,..Y15 , поэтому товары будут отсортированы так: ... . У второго покупателя набор весов Y21,..Y25 , поэтому товары будут отсортированы иначе: ... .
    Как только Вы это распишете, то увидите, какие данные должны быть в БД, чтобы получить нужный результат ( если это возможно)
  • rinaz22,

    Тогда это же получиться все общая сортировка. А мне нужно индивидуальная под каждого покупателя. Учитывать их предыдущие покупки и т.п.

    Ну так и учитывай в выражении сортировки эти самые особенности для текущего покупателя, какие проблемы-то? Можешь хоть подзапрос там залепить.. правда, сортироваться оно тогда будет до ишачьей пасхи.

  • Ну, если буквально понимать задачу, и у вас нужная характеристика имеет конкретное значение, то сортировать список нужно так:

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

    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, --  <Другие условия сортировки (по дате добавления, имени и т.д.)>

    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, -- эта менее важная характеристика -- ... и так далее все характеристики <Другие условия сортировки (по дате добавления, имени и т.д.)>

    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, -- эта менее важная характеристика -- ... и так далее все характеристики <Другие условия сортировки (по дате добавления, имени и т.д.)>

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

    • Второй вариант наиболее подходящий. Спасибо!
    Нужно решить такую задачу?

    Опишите проблему, и специалист поможет с настройкой, исправлением ошибки или доработкой сайта. Подберём понятный план работ без лишней переписки.

    Заказать помощь
    Лучший ответ
    1
    Виктор Sys Ответ

    Для сортировки позиций в базе данных по заданным весам, вы можете использовать поле "вес" в вашей таблице.

    Прежде всего, убедитесь, что у ваших позиций есть поле "вес", которое будет использоваться для определения порядка сортировки.

    Для выполнения сортировки по заданным весам, вы можете использовать SQL запрос с использованием оператора ORDER BY. Например, если у вас есть таблица "позиции" с полями "id", "название" и "вес", и вы хотите отсортировать их по возрастанию веса, вы можете использовать следующий запрос:

    SELECT * FROM positions ORDER BY weight ASC;

    SELECT * FROM positions ORDER BY weight ASC;

    В этом запросе "ASC" означает сортировку по возрастанию. Если вы хотите отсортировать по убыванию веса, замените "ASC" на "DESC".

    Если у вас есть несколько позиций с одинаковым весом, вы можете добавить дополнительные условия сортировки, чтобы определить порядок среди них. Например, если вы хотите сначала отсортировать по весу, а затем по алфавиту, вы можете использовать следующий запрос:

    SELECT * FROM positions ORDER BY weight ASC, name ASC;

    SELECT * FROM positions ORDER BY weight ASC, name ASC;

    Таким образом, вы можете легко сортировать позиции в вашей базе данных по заданным весам, используя SQL запросы с оператором ORDER BY.

    Другие ответы (0)

    Пока нет других ответов. Будьте первым, кто поможет автору.

    Ответить на вопрос

    комментарий

    Ваш адрес email не будет опубликован. Обязательные поля помечены *

    Вам также может быть интересно