Вот мой алгоритм:
- подсчитывать частоту каждого имени
- упорядочивать по убыванию частоты и имени
- разрезать на разделы до максимальной частоты
- количество строк в каждом разделе
- порядок по номеру строки и номеру раздела
Пример: имена A, B, C, D, E
step 1 and 2
------------
AAAAABBCCDDEE
step 3 and 4
------------
12345
AAAAA
BBCCD
DEE
step 5
------
ABDABEACEACAD
Запрос:
with counted as
(
select id, fruit, name, count(*) over (partition by name) as cnt
from mytable
)
select id, fruit, name
from counted
order by
(row_number() over (order by cnt desc, name) - 1) % max(cnt) over (),
row_number() over (order by cnt desc, name);
Общие табличные выражения (WITH
предложения) и оконные функции (агрегация OVER
) доступны с MySQL 8 или MariaDB 10.2.Перед этим вы можете вернуться к подзапросам, которые сделают один и тот же запрос довольно длинным и трудным для чтения.Я полагаю, вы могли бы также использовать переменные вместо этого, каким-то образом.
Демонстрация скриптов БД: https://www.db -fiddle.com / f / 8amYX6iRu8AsnYXJYz15DF / 1