Есть ли способ в SQL (MySQL) сделать ORDER BY "круговой прием" на определенном поле? - PullRequest
6 голосов
/ 10 марта 2009

Есть ли способ в SQL (MySQL) сделать ORDER BY "циклического перебора" для определенного поля?

В качестве примера я хотел бы взять такую ​​таблицу:

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

И выполните запрос, который выдаст результаты в следующем порядке:

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

Обратите внимание, что в таблице может быть много строк, поэтому я не могу упорядочить приложение. (Очевидно, что в запросе также было бы предложение LIMIT).

Ответы [ 3 ]

7 голосов
/ 10 марта 2009

Я бы попробовал что-то вроде:

SET @counter = 0;
SELECT (@counter:=@counter+1)%3 as rr, grp, name FROM table ORDER by rr, grp 
5 голосов
/ 10 марта 2009

Что вы можете сделать, это создать временный столбец, в котором вы создаете наборы, чтобы дать вам что-то вроде этого:

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

Чтобы узнать, как создавать наборы, взгляните на этот вопрос / ответ .

Тогда это просто

ORDER BY tmp, group, name
3 голосов
/ 10 марта 2009

Для этого можно использовать переменные MySQL.

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