2009-03-10 10 views
6

Czy istnieje sposób w SQL (MySQL), aby zrobić "round robin" ORDER BY na określonym polu?Czy istnieje sposób w SQL (MySQL), aby zrobić "round robin" ORDER BY na konkretnym polu?

Jako przykład chciałbym wziąć tablicę takich jak ten:

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

i uruchomić kwerendę, która daje rezultaty w tej kolejności:

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

Zauważ, że tabela może mieć wiele wierszy, więc nie mogę wykonać zamówienia w aplikacji. (Oczywiście miałbym również w zapytaniu klauzulę LIMIT).

Odpowiedz

5

Co można zrobić, to stworzyć tymczasową kolumnę, w której tworzenie zestawów, aby dać Ci coś takiego:

+-------+------+-----+ 
| 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 | 
+-------+------+-----+ 

nauczyć się tworzyć zestawy, przyjrzeć się tej question/answer.

to jego prosta

ORDER BY tmp, group, name 
7

Chciałbym spróbować czegoś takiego:

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

Można używać zmiennych MySQL to zrobić.

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 | 
+------+------+--------------+