少し掘り下げた後、両方のシナリオを確認できます:
MySQL5.1はORDER BY
を適用します サブクエリ内。
Linux上のMariaDB5.5.39はしません ORDER BY
を適用します LIMIT
がない場合のサブクエリ内 供給されます。 します ただし、対応するLIMIT
の場合は、順序を正しく適用してください。 与えられる:
SELECT t2.Code
FROM (
SELECT Country.Code FROM Country ORDER BY Country.Code DESC LIMIT 2
) AS t2;
そのLIMIT
がないと 、サブクエリ内で並べ替えを適用する正当な理由はありません。同等に外部クエリに適用できます。
文書化された動作:
結局のところ、MariaDBはこの動作を文書化しています バグとは見なされません:
「テーブル」(および
FROM
のサブクエリ 句も)-SQL標準によると-順序付けされていない行のセットです。テーブル(またはFROM
のサブクエリ)の行 条項)特定の順序ではありません。そのため、オプティマイザーはORDER BY
を無視できます。 指定した句。実際、SQL標準ではORDER BY
も許可されていません このサブクエリに表示される句(ORDER BY ... LIMIT
のため、許可します ...結果、行のセット、順序だけでなく変更します。
FROM
でサブクエリを処理する必要があります 句、不特定および未定義の順序の行のセットとして、ORDER BY
を配置します トップレベルのSELECT
。
そのため、MariaDBはORDER BY
を適用することもお勧めします 最も外側のクエリ、またはLIMIT
必要に応じて。
注:現在、適切なMySQL 5.5または5.6にアクセスして、動作が同じであるかどうかを確認できません(SQLFiddle.comが誤動作しています)。 元のバグレポートへのコメント (バグではないとしてクローズ)MySQL5.6はおそらくMariaDBと同じように動作することを示唆しています。