J'ai une requête qui ressemble à ceci:
SELECT article FROM table1 ORDER BY publish_date LIMIT 20
Comment fonctionne ORDER BY? Ordonnera-t-il tous les enregistrements, puis obtiendra-t-il les 20 premiers, ou obtiendra-t-il 20 enregistrements et les publish_date
classera-t-il sur le terrain?
Si c'est le dernier, vous n'êtes pas assuré d'obtenir vraiment les 20 articles les plus récents.
publish_date
s sont égaux, la commande par eux ne donne pas de résultats déterminés, ce qui signifie que si vous utilisezLIMIT
pour la pagination, vous pouvez finir par obtenir les mêmes éléments sur différentes pages!Réponses:
Il ordonnera d'abord, puis obtiendra les 20 premiers. Une base de données traitera également tout ce qui se trouve dans la
WHERE
clause précédenteORDER BY
.la source
LIMIT
les pausesORDER BY
. AvecLIMIT
unORDER BY
retour de mauvais résultat.LIMIT
réorganise en quelque sorte le jeu de résultats retourné parORDER BY
La clause LIMIT peut être utilisée pour limiter le nombre de lignes renvoyées par l'instruction SELECT. LIMIT prend un ou deux arguments numériques, qui doivent tous deux être des constantes entières non négatives (sauf lors de l'utilisation d'instructions préparées).
Avec deux arguments, le premier argument spécifie le décalage de la première ligne à renvoyer et le second spécifie le nombre maximal de lignes à renvoyer. Le décalage de la ligne initiale est 0 (pas 1):
SELECT * FROM tbl LIMIT 5,10; # Retrieve rows 6-15
Pour récupérer toutes les lignes d'un certain décalage jusqu'à la fin de l'ensemble de résultats, vous pouvez utiliser un grand nombre pour le deuxième paramètre. Cette instruction récupère toutes les lignes de la 96e ligne à la dernière:
SELECT * FROM tbl LIMIT 95,18446744073709551615;
Avec un argument, la valeur spécifie le nombre de lignes à renvoyer depuis le début de l'ensemble de résultats:
SELECT * FROM tbl LIMIT 5; # Retrieve first 5 rows
En d'autres termes, LIMIT row_count est équivalent à LIMIT 0, row_count.
Tous les détails sur: http://dev.mysql.com/doc/refman/5.0/en/select.html
la source
Tout comme @James le dit, il ordonnera tous les enregistrements, puis obtiendra les 20 premières lignes.
Dans l'état actuel des choses, vous êtes assuré d'obtenir les 20 premiers articles publiés, les plus récents ne seront pas affichés.
Dans votre situation, je vous recommande d' ajouter
desc
àorder by publish_date
, si vous voulez que les articles les plus récents, le plus récent article sera le premier.Si vous avez besoin de conserver le résultat dans l'ordre croissant et que vous ne voulez toujours que les 10 derniers articles, vous pouvez demander à mysql de trier votre résultat deux fois.
Cette requête ci-dessous triera le résultat par ordre décroissant et limitera le résultat à 10 (c'est-à-dire la requête entre parenthèses). Il sera toujours trié par ordre décroissant, et nous ne sommes pas satisfaits de cela, nous demandons donc à mysql de le trier une fois de plus. Nous avons maintenant le résultat le plus récent sur la dernière ligne.
Si vous avez besoin de toutes les colonnes, cela se fait de cette façon:
J'utilise cette technique lorsque j'écris manuellement des requêtes pour examiner la base de données pour diverses choses. Je ne l'ai pas utilisé dans un environnement de production, mais maintenant quand je l'ai marqué, le tri supplémentaire n'a pas d'impact sur les performances.
la source
S'il existe un index approprié, dans ce cas sur le
publish_date
terrain, alors MySQL n'a pas besoin d'analyser l'intégralité de l'index pour obtenir les 20 enregistrements demandés - les 20 enregistrements seront trouvés au début de l'index. Mais s'il n'y a pas d'index approprié, une analyse complète de la table sera nécessaire.Il y a un article MySQL Performance Blog de 2009 à ce sujet.
la source
Vous pouvez ajouter [asc] ou [desc] à la fin de la commande pour obtenir les enregistrements les plus anciens ou les plus récents
Par exemple, cela vous donnera d'abord les derniers enregistrements
Ajouter la
LIMIT
clause aprèsORDER BY
la source
Vous pouvez utiliser ce code
SELECT article FROM table1 ORDER BY publish_date LIMIT 0,10
où 0 est une limite de début d'enregistrement et 10 nombre d'enregistrementla source
LIMIT 10
est un raccourci pourLIMIT 0,10
.LIMIT est généralement appliqué comme dernière opération, donc le résultat sera d'abord trié puis limité à 20. En fait, le tri s'arrêtera dès que les 20 premiers résultats triés seront trouvés.
la source
La syntaxe de LIMIT est également différente selon les bases de données, par exemple:
mysql
- LIMITE 1, 2postgres
- LIMITE 2 OFFSET 1la source