2009-03-10 7 views
6

Y a-t-il un moyen en SQL (MySQL) de faire un "round robin" ORDER BY sur un champ particulier?Existe-t-il un moyen en SQL (MySQL) de faire un "round robin" ORDER BY sur un champ particulier?

À titre d'exemple, je voudrais prendre une table comme celle-ci:

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

Et exécuter 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 avoir beaucoup de lignes, donc je ne peux pas faire la commande dans l'application. (J'ai évidemment une clause LIMIT dans la requête).

Répondre

5

Ce que vous pouvez faire est de créer une colonne temporaire dans lequel vous créez des jeux 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 jeux, jetez un oeil à ce question/answer.

Puis son simple

ORDER BY tmp, group, name 
7

Je vais essayer quelque chose comme:

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

Vous pouvez utiliser des variables MySQL pour le faire.

SELECT grp, name, @row:[email protected]+1 from table, (SELECT @row:=0) r ORDER BY (@row % 3); 

+------+------+--------------+ 
| grp | name | @row:[email protected]+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 | 
+------+------+--------------+ 
Questions connexes