このようなものはMySQLで機能するはずです:
SELECT a.*
FROM (
SELECT ... FROM ... ORDER BY ...
) a
UNION ALL
SELECT b.*
FROM (
SELECT ... FROM ... ORDER BY ...
) b
返される順序で行を返す。つまり、MySQLはORDER BY
を尊重しているようです インラインビュー内の句。
ただし、 ORDER BY
がない場合 最も外側のクエリの句では、行が返される順序はではありません。 保証されています。
特定の順序で行を返す必要がある場合は、ORDER BY
を含めることができます 最も外側のクエリで。多くのユースケースでは、ORDER BY
を使用するだけです。 結果を満たすために最も外側のクエリで。
ただし、最初のクエリのすべての行を2番目のクエリのすべての行の前に返す必要があるユースケースがある場合、1つのオプションは、各クエリに追加の識別子列を含めることです。たとえば、 ,'a' AS src
を追加します 最初のクエリでは、 ,'b' AS src
2番目のクエリに移動します。
次に、最も外側のクエリに ORDER BY src, name
を含めることができます。 、結果の順序を保証します。
フォローアップ
元のクエリでは、ORDER BY
クエリ内はオプティマイザによって破棄されます。 ORDER BY
がないため 外部クエリに適用すると、MySQLは自由に行を好きな順序で返すことができます。
私の回答(上記)のクエリの「トリック」は、MySQLの一部のバージョンに固有の動作に依存しています。
テストケース:
テーブルにデータを入力
CREATE TABLE foo2 (id INT PRIMARY KEY, role VARCHAR(20)) ENGINE=InnoDB;
CREATE TABLE foo3 (id INT PRIMARY KEY, role VARCHAR(20)) ENGINE=InnoDB;
INSERT INTO foo2 (id, role) VALUES
(1,'sam'),(2,'frodo'),(3,'aragorn'),(4,'pippin'),(5,'gandalf');
INSERT INTO foo3 (id, role) VALUES
(1,'gimli'),(2,'boromir'),(3,'elron'),(4,'merry'),(5,'legolas');
クエリ
SELECT a.*
FROM ( SELECT s.id, s.role
FROM foo2 s
ORDER BY s.role
) a
UNION ALL
SELECT b.*
FROM ( SELECT t.id, t.role
FROM foo3 t
ORDER BY t.role
) b
結果セットが返されました
id role
------ ---------
3 aragorn
2 frodo
5 gandalf
4 pippin
1 sam
2 boromir
3 elron
1 gimli
5 legolas
4 merry
foo2
からの行 「順番に」返され、その後にfoo3
の行が続きます 、繰り返しますが、「順番に」。
この動作はないことに注意してください。 保証されています。 (私たちが観察する動作は、MySQLがインラインビュー(派生テーブル)を処理する方法の副作用です。この動作は、5.5以降のバージョンでは異なる場合があります。)
特定の順序で行を返す必要がある場合は、 ORDER BY
を指定します 最も外側のクエリの句。そして、その順序は全体に適用されます 結果セット。
前述したように、最初に最初のクエリの行が必要で、次に2番目のクエリが必要な場合は、各クエリに「discriminator」列を含め、次にORDERBY句に「discriminator」列を含めます。また、インラインビューを廃止し、次のようにします。
SELECT s.id, s.role, 's' AS src
FROM foo2 s
UNION ALL
SELECT t.id, t.role, 't' AS src
FROM foo3 t
ORDER BY src, role