Existe-t-il un moyen en SQL (MySQL) d’effectuer un «round robin» ORDER BY sur un champ particulier?

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

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

Était-ce utile?

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 |
+------+------+--------------+
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top