Existe-t-il un moyen en SQL (MySQL) d’effectuer un «round robin» ORDER BY sur un champ particulier?
-
08-07-2019 - |
Question
Existe-t-il un moyen en SQL (MySQL) de faire un "round robin"? ORDER BY sur un domaine particulier?
Par exemple, je voudrais prendre un tableau comme celui-ci:
+-------+------+
| group | name |
+-------+------+
| 1 | A |
| 1 | B |
| 1 | C |
| 2 | D |
| 2 | E |
| 2 | F |
| 3 | G |
| 3 | H |
| 3 | I |
+-------+------+
Et exécutez une requête qui produit des résultats dans cet ordre:
+-------+------+
| group | name |
+-------+------+
| 1 | A |
| 2 | D |
| 3 | G |
| 1 | B |
| 2 | E |
| 3 | H |
| 1 | C |
| 2 | F |
| 3 | I |
+-------+------+
Notez que la table peut comporter plusieurs lignes, je ne peux donc pas effectuer de commande dans l'application. (J'aurais évidemment une clause LIMIT également dans la requête).
La solution
Ce que vous pouvez faire est de créer une colonne temporaire dans laquelle vous créez des ensembles pour vous donner quelque chose comme ceci:
+-------+------+-----+
| 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 |
+-------+------+-----+
Pour savoir comment créer les ensembles, consultez cette question / répondre .
Ensuite, c'est un simple
ORDER BY tmp, group, name
Autres conseils
J'essaierais quelque chose comme:
SET @counter = 0;
SELECT (@counter:=@counter+1)%3 as rr, grp, name FROM table ORDER by rr, grp
Vous pouvez utiliser des variables MySQL pour le faire.
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 |
+------+------+--------------+