6

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 句があります)。

4

3 に答える 3

7

私は次のようなものを試してみます:

SET @counter = 0;
SELECT (@counter:=@counter+1)%3 as rr, grp, name FROM table ORDER by rr, grp 
于 2009-03-10T17:04:15.390 に答える
5

できることは、次のようなものを提供するセットを作成する一時的な列を作成することです。

+-------+------+-----+
| 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
于 2009-03-10T17:02:47.700 に答える
3

これを行うには、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 |
+------+------+--------------+
于 2009-03-10T17:13:27.053 に答える