Existe uma maneira no SQL (MySQL) para fazer um ORDER “round robin” BY em um campo particular?
-
08-07-2019 - |
Pergunta
Existe uma maneira no SQL (MySQL) para fazer um ORDER "round robin" BY em um campo particular?
Como um exemplo, eu gostaria de ter uma tabela como esta:
+-------+------+
| group | name |
+-------+------+
| 1 | A |
| 1 | B |
| 1 | C |
| 2 | D |
| 2 | E |
| 2 | F |
| 3 | G |
| 3 | H |
| 3 | I |
+-------+------+
E executar uma consulta que produz resultados na seguinte ordem:
+-------+------+
| group | name |
+-------+------+
| 1 | A |
| 2 | D |
| 3 | G |
| 1 | B |
| 2 | E |
| 3 | H |
| 1 | C |
| 2 | F |
| 3 | I |
+-------+------+
Note que a tabela pode ter muitas linhas, então eu não posso fazer a encomenda na aplicação. (Eu, obviamente, têm uma cláusula LIMIT bem na consulta).
Solução
O que você pode fazer é criar uma coluna temporária em que você criar conjuntos para dar-lhe algo como isto:
+-------+------+-----+
| group | name | tmp |
+-------+------+-----+
| 1 | A | 1 |
| 1 | B | 2 |
| 1 | C | 3 |
| 2 | D | 1 |
| 2 | E | 2 |
| 2 | F | 3 |
| 3 | G | 1 |
| 3 | H | 2 |
| 3 | I | 3 |
+-------+------+-----+
Para saber como criar os sets, ter um olhar para esta questão / responder .
Então é um simples
ORDER BY tmp, group, name
Outras dicas
Eu tentaria algo como:
SET @counter = 0;
SELECT (@counter:=@counter+1)%3 as rr, grp, name FROM table ORDER by rr, grp
Você pode usar variáveis ??do MySQL para fazer isso.
SELECT grp, name, @row:=@row+1 from table, (SELECT @row:=0) r ORDER BY (@row % 3);
+------+------+--------------+
| grp | name | @row:=@row+1 |
+------+------+--------------+
| 1 | A | 1 |
| 2 | D | 4 |
| 3 | G | 7 |
| 1 | B | 2 |
| 2 | E | 5 |
| 3 | H | 8 |
| 1 | C | 3 |
| 2 | F | 6 |
| 3 | I | 9 |
+------+------+--------------+
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow