¿Hay alguna manera en SQL (MySQL) para hacer un & # 8220; round robin & # 8221; ORDER BY en un campo en particular?
-
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).
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