web-dev-qa-db-fra.com

MySQL LIMIT est-il appliqué avant ou après ORDER BY?

Lequel vient en premier lorsque MySQL traite la requête?

Un exemple:

SELECT pageRegions
FROM pageRegions WHERE(pageID=?) AND(published=true) AND (publishedOn<=?)
ORDER BY publishedON DESC
LIMIT 1';

Est-ce que cela retournera la dernière pageRegion publiée même si l'enregistrement ne correspond pas à la date/heure de révision SI LIMIT est appliqué après ORDER BY?

36
Chris Abrams

Oui, c'est après la commande. Pour votre requête, vous obtiendrez l'enregistrement avec la valeur publiée la plus élevée, car vous commandez DESC, ce qui donne la plus grande valeur en premier dans le jeu de résultats, dont vous choisissez la première.

33
Marc B

limit est toujours appliqué à la fin de la collecte des résultats, donc après order by.

Compte tenu de toutes vos clauses, l'ordre de traitement sera

  • DE
  • SÉLECTIONNER
  • COMMANDÉ PAR
  • LIMITE

Ainsi, vous obtiendrez l'enregistrement le plus proche <= publishedOn correspondant à toutes les conditions de la clause WHERE.

24
RichardTheKiwi

Je voulais juste souligner le cas où la commande MySQL est appliquée avant de limiter les résultats. Mais ce n'est pas vrai pour les autres DB.

Par exemple, Oracle limite d'abord les résultats et applique un ordre sur ces résultats. Cela a du sens lorsque vous y pensez du point de vue des performances. Dans MySQL, vous commandez en fait la base de données entière (> 1000 enregistrements) pour obtenir 2

3
Cristian