少し掘り下げた後、両方のシナリオを確認できます:
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と同じように動作することを示唆しています。