Как сортировать позиции в БД по заданным весам?
Всем привет! Есть некий интернет-магазин, где одинаковые товары, но с разной характеристикой(всего 1). Хочу сделать более или менее умную рекомендацию, чтобы в первых рядах было максимально нужное покупателю товар. Параметров для выбора наилучшего будет несколько и не только касаемо самого товара. Подумал тут подойдет "вес" каждого фильтра, но вот проблема, я никогда подобное не делал. В PHP я примерно понимаю как это можно сделать, но вот как это сделать в mysql при получении запроса? Также не стоит забывать про пагинацию
Дополнительно:
Задавая столь общий вопрос, можно получить только весьма общий ответ:
Составьте выражение, которое превратит кучу значений и их весов в одно общее значение (комбинированный вес), и используйте его в выражении сортировки.
Как только Вы это распишете, то увидите, какие данные должны быть в БД, чтобы получить нужный результат ( если это возможно)
Тогда это же получиться все общая сортировка. А мне нужно индивидуальная под каждого покупателя. Учитывать их предыдущие покупки и т.п.
Ну так и учитывай в выражении сортировки эти самые особенности для текущего покупателя, какие проблемы-то? Можешь хоть подзапрос там залепить.. правда, сортироваться оно тогда будет до ишачьей пасхи.
Ну, если буквально понимать задачу, и у вас нужная характеристика имеет конкретное значение, то сортировать список нужно так:
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, -- эта менее важная характеристика -- ... и так далее все характеристики <Другие условия сортировки (по дате добавления, имени и т.д.)>
Можно комбинировать подходы, если есть куча характеристик на одном уровне иерархии.
- Второй вариант наиболее подходящий. Спасибо!
Опишите проблему, и специалист поможет с настройкой, исправлением ошибки или доработкой сайта. Подберём понятный план работ без лишней переписки.
Пока нет других ответов. Будьте первым, кто поможет автору.
Ответить на вопрос
Для сортировки позиций в базе данных по заданным весам, вы можете использовать поле "вес" в вашей таблице.
Прежде всего, убедитесь, что у ваших позиций есть поле "вес", которое будет использоваться для определения порядка сортировки.
Для выполнения сортировки по заданным весам, вы можете использовать SQL запрос с использованием оператора ORDER BY. Например, если у вас есть таблица "позиции" с полями "id", "название" и "вес", и вы хотите отсортировать их по возрастанию веса, вы можете использовать следующий запрос:
SELECT * FROM positions ORDER BY weight ASC;
В этом запросе "ASC" означает сортировку по возрастанию. Если вы хотите отсортировать по убыванию веса, замените "ASC" на "DESC".
Если у вас есть несколько позиций с одинаковым весом, вы можете добавить дополнительные условия сортировки, чтобы определить порядок среди них. Например, если вы хотите сначала отсортировать по весу, а затем по алфавиту, вы можете использовать следующий запрос:
SELECT * FROM positions ORDER BY weight ASC, name ASC;
Таким образом, вы можете легко сортировать позиции в вашей базе данных по заданным весам, используя SQL запросы с оператором ORDER BY.