Comportement ORDER BY de la sous-requête MySQL/MariaDB
Dans les versions MySQL antérieures à 5.5, la clause ORDER BY dans une sous-requête était appliquée comme prévu. Cependant, dans les versions récentes de MariaDB (par exemple, 10.0.14), la clause ORDER BY n'est pas appliquée dans les sous-requêtes lorsqu'aucune clause LIMIT n'est spécifiée.
Bogue ou changement de comportement ?
Après avoir étudié ce problème, il a été confirmé que ce comportement est intentionnel et non un bug. MariaDB suit la norme SQL, qui ne nécessite pas d'ordre spécifique pour les lignes dans les sous-requêtes. Par conséquent, la clause ORDER BY est ignorée dans les sous-requêtes.
Comportement documenté
Selon la documentation MariaDB, il est recommandé d'appliquer la clause ORDER BY à la requête la plus externe ou ajoutez une clause LIMIT pour appliquer l'ordre dans le sous-requête.
Exemple
La requête suivante démontre la différence de comportement :
SELECT t2.Code FROM ( SELECT Country.Code FROM Country ORDER BY Country.Code DESC ) AS t2;
Sans clause LIMIT, MariaDB n'appliquera pas la commande ORDER Clause BY à l'intérieur de la sous-requête, ce qui entraîne un résultat non ordonné. Pour appliquer l'ordre décroissant, une clause LIMIT peut être ajoutée :
SELECT t2.Code FROM ( SELECT Country.Code FROM Country ORDER BY Country.Code DESC LIMIT 2 ) AS t2;
En ajoutant la clause LIMIT, la clause ORDER BY est appliquée dans la sous-requête, ce qui donne un résultat correctement décroissant.
Remarque
Il est important de noter que ce changement de comportement peut également affecter les versions de MySQL au-delà de la 5.5. Consultez toujours la documentation officielle ou les notes de version pour confirmer le comportement spécifique de la version que vous utilisez.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!