Сортировка в MySQL по диапазону цен по группам

Нужно сделать следующую выборку-сортировку в MySQL: Нужно выбрать 10 товаров дороже 100 руб., 10 товаров от 50 до 100 руб., 10 товаров от 30 до 50, 10 товаров от 20 до 30, 10 товаров 10 до 20 и отсортировать их рандомно и выбрать как первые 50 товаров. Далее опять выводим по той же формуле следующие 50 товаров и т.д.


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

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

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

select *
  from (
    select t.*, x.num, ceil((row_number() over(partition by x.num))/10 order by rand()) grp10
      from Tab t
      join (select 100 f, 1000000 t, 1 num union select 50, 100, 2 union select 30, 50, 3 ...) x
     where t.цена >= x.f and t.цена < x.t
  ) y
order by grp10, num

Основная идея - получаем номера диапазонов цен (num). Назначаем каждой записи номер группы, как целую часть от деления порядкового номера внутри диапазона цен в случайной сортировке на 10. Выводим в порядке номеров групп и номеров ценовых диапазонов. Получаем по 10 записей каждого типа, в порядке расположения типов. Группы по 50 получаются автоматически при достаточном количестве записей. Или попробовать сделать итоговый order by grp10, rand() что бы перемешать записи рандомно целиком внутри групп по 50 шт.

→ Ссылка