Eu gostaria de classificar todas as linhas em uma tabela, uma por categoria em um loop. Por exemplo, dados os seguintes dados:
+---------+-------------+
| item_id | category_id |
+---------+-------------+
| 4013738 | 1102 |
| 4016142 | 1102 |
| 4027380 | 1102 |
| 4029166 | 1014 |
| 4031335 | 1125 |
| 4031984 | 1014 |
| 4031986 | 1014 |
| 5034654 | 1123 |
| 5034656 | 1125 |
| 5034662 | 1125 |
| 5034735 | 1109 |
| 5034736 | 1109 |
| 5034737 | 1109 |
| 5040226 | 1123 |
| 5040227 | 1123 |
+---------+-------------+
O conjunto de resultados desejado deve ser assim:
+---------+-------------+
| item_id | category_id |
+---------+-------------+
| 4029166 | 1014 |
| 4013738 | 1102 |
| 5034735 | 1109 |
| 5034654 | 1123 |
| 4031335 | 1125 |
| 4031984 | 1014 |
| 4016142 | 1102 |
| 5034736 | 1109 |
| 5040226 | 1123 |
| 5034656 | 1125 |
| 4031986 | 1014 |
| 4027380 | 1102 |
| 5034737 | 1109 |
| 5040227 | 1123 |
| 5034662 | 1125 |
+---------+-------------+
Os item_id
em categorias consecutivas também devem ser ordenados. Se algumas categorias contiverem mais itens do que outras, o ciclo deve continuar com a mesma lógica com as linhas restantes.
Esta seria uma tarefa bastante trivial em uma linguagem de script como php, mas eu não posso pensar em como realizá-la em sql.
Aqui está um violino db com dados de amostra: https://www.db-fiddle.com/f/ioZzvoQfnSNiowe6Rp7QP5/0
Usando a categoria como uma janela, dei às linhas um número dentro dessa janela, que usei para ordenar todas as linhas. Dessa forma, obtive todas as linhas que estavam em primeiro lugar em sua categoria, depois todas as que vieram em segundo lugar e assim por diante. Observe que eu não pedi por item_id, então isso pode não ser exatamente o que você precisa, mas deve ajudá-lo.
veja dbfiddle