SQL(MySQL)で特定のフィールドで「ラウンドロビン」ORDER BYを実行する方法はありますか?
-
08-07-2019 - |
質問
SQL(MySQL)で" round robin"を実行する方法はありますか?特定のフィールドでの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句が含まれていることは明らかです)。
解決
できることは、セットを作成する一時列を作成して、次のようなものを提供することです。
+-------+------+-----+
| 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 |
+-------+------+-----+
セットの作成方法については、この question /をご覧ください。回答。
その後、単純な
ORDER BY tmp, group, name
他のヒント
次のようなものを試します:
SET @counter = 0;
SELECT (@counter:=@counter+1)%3 as rr, grp, name FROM table ORDER by rr, grp
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 |
+------+------+--------------+
所属していません StackOverflow