¿Hay alguna manera en SQL (MySQL) para hacer un & # 8220; round robin & # 8221; ORDER BY en un campo en particular?

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

  •  08-07-2019
  •  | 
  •  

Pregunta

¿Hay alguna manera en SQL (MySQL) para hacer un "round robin"? ORDER BY en un campo en particular?

Como ejemplo, me gustaría tomar una tabla como esta:

+-------+------+
| group | name |
+-------+------+
|     1 | A    |
|     1 | B    |
|     1 | C    |
|     2 | D    |
|     2 | E    |
|     2 | F    |
|     3 | G    |
|     3 | H    |
|     3 | I    |
+-------+------+

Y ejecuta una consulta que produce resultados en este orden:

+-------+------+
| group | name |
+-------+------+
|     1 | A    |
|     2 | D    |
|     3 | G    |
|     1 | B    |
|     2 | E    |
|     3 | H    |
|     1 | C    |
|     2 | F    |
|     3 | I    |
+-------+------+

Tenga en cuenta que la tabla puede tener muchas filas, por lo que no puedo hacer el pedido en la aplicación. (Obviamente también tendría una cláusula LIMIT en la consulta).

¿Fue útil?

Solución

Lo que puede hacer es crear una columna temporal en la que cree conjuntos para obtener algo como esto:

+-------+------+-----+
| 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 aprender cómo crear los conjuntos, eche un vistazo a esta pregunta / responder .

Entonces es un simple

ORDER BY tmp, group, name

Otros consejos

Intentaría algo como:

SET @counter = 0;
SELECT (@counter:=@counter+1)%3 as rr, grp, name FROM table ORDER by rr, grp 

Puede usar variables MySQL para hacer esto.

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 bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top