Вывод в начало списка трёх случайных позиций из списка приоритетных

Есть таблица (используется MariaDB) со списком товаров. В таблице три поля:

Имя поля Описание
id id товара
title название товара
id_seller id продавца

В этой таблице для каждого id_seller может быть много строк. Есть список продавцов, товары которых всегда должны быть вверху списка. Но - вверху списка должны быть только три случайно выбранных товара от трёх разных продавцов, а остальные товары сортируются в обычном порядке.

Как это реализовать в sql-запросе? Если использовать order by FIELD (id_seller, <список>), то вверху будут все товары всех продавцов из списка, а надо только чтобы три случайных товара трёх случайных продавцов из списка.


Ответы (1 шт):

Автор решения: FatherOfFiveChildren

Исходя из собственного опыта предлагаю разделить задачу на 2 части.

  1. Процедура вычисления поля сортировки.
  2. Вывод запроса

Если надо вытащить топ позиций, то надо сделать еще одно поле в таблице товаров для сортировки например topOrderId. В нем менеджер магазина или твоя процедура предварительно определяет позиции которые надо поднять наверх.

Дальше просто сортируешь по этому полю.

select * from Seller s 
inner join Products p on s.sallerid = p.sallerid
order by p.topOrderId desc

Менеджеры особенно любят вручную менять это поле, поскольку это дает им возможность гибко управлять продажами.

Если уже есть таблица с приоритетными позициями просто подключи сортировку по ней

select * from Seller s 
inner join Products p on s.sallerid = p.sallerid
left join ProductsTop pt on pt.productId = p.productId
order by pt.topOrderId desc
→ Ссылка