Existe uma maneira no SQL (MySQL) para fazer um ORDER “round robin” BY em um campo particular?

StackOverflow https://stackoverflow.com/questions/631259

  •  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).

Foi útil?

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
scroll top