MySQL/MariaDB : Trier par dans les sous-requêtes
Les versions récentes de MySQL et MariaDB ont introduit des changements dans la gestion de la commande par opérations dans les sous-requêtes.
Original Requête :
SELECT t2.Code from (select Country.Code from Country order by Country.Code desc ) AS t2;
Problème :
Dans MySQL 5.5 et versions antérieures, la requête ci-dessus triait les résultats de la sous-requête par ordre décroissant comme spécifié. Cependant, dans les versions plus récentes de MySQL et MariaDB, les résultats des sous-requêtes ne sont plus triés par défaut par ordre décroissant.
Raison :
Le changement de comportement est dû à une respect de la norme SQL. Selon la norme, les résultats des sous-requêtes sont des ensembles de lignes non ordonnés. Par conséquent, l'application d'une clause order by dans une sous-requête peut ne pas garantir le tri souhaité.
Résolution :
Pour résoudre le problème, deux approches sont recommandées :
SELECT t2.Code from (select Country.Code from Country) AS t2 ORDER BY t2.Code DESC;
SELECT t2.Code from (select Country.Code from Country ORDER BY Country.Code DESC LIMIT 2) AS t2;
Ceci garantit que la sous-requête produit un ensemble de résultats triés, qu'une clause order by soit appliquée ou non à la requête la plus externe. SELECT.
Comportement documenté :
MariaDB a officiellement documenté ce comportement, déclarant que la spécification d'une clause order by dans une sous-requête n'est pas autorisée par la norme SQL et devrait être traité comme un ensemble non ordonné de lignes. L'approche recommandée consiste à appliquer l'ordre par à la requête la plus externe ou à utiliser une limite si nécessaire.
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!