2009-03-10 30 views
6

Có cách nào trong SQL (MySQL) để làm một "vòng robin" ORDER BY trên một lĩnh vực cụ thể?Có cách nào trong SQL (MySQL) để làm một "vòng robin" ORDER BY trên một lĩnh vực cụ thể?

Như một ví dụ, tôi muốn để có một bảng như thế này một:

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

Và chạy một truy vấn mà tạo ra kết quả theo thứ tự này:

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

Lưu ý rằng bảng có thể có nhiều hàng, vì vậy tôi không thể thực hiện việc đặt hàng trong ứng dụng. (Tôi rõ ràng sẽ có một mệnh đề LIMIT cũng như trong truy vấn).

Trả lời

5

Những gì bạn có thể làm là tạo ra một cột tạm thời, trong đó bạn tạo bộ để cung cấp cho bạn một cái gì đó như thế này:

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

Để tìm hiểu làm thế nào để tạo ra các bộ, có một cái nhìn tại question/answer này.

Sau đó, nó đơn giản

ORDER BY tmp, group, name 
7

Tôi muốn thử một cái gì đó như:

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

Bạn có thể sử dụng các biến MySQL để làm điều này.

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 | 
+------+------+--------------+ 
Các vấn đề liên quan