Récemment, j'ai découvert que MySQL a une fonction offset
. J'ai essayé de trouver de la documentation sur les résultats de l'offset, ou la différence entre l'offset et la variante de limite, mais je n'arrive pas à trouver ce que je cherche.
Disons que j'ai 10 000 lignes dans une table et que je veux 25 résultats, à partir de la ligne 1 000. Pour autant que je suis arrivé jusqu'ici, je pouvais faire les deux pour obtenir le même résultat:
SELECT id,name,description FROM tablename LIMIT 1000,25
SELECT id,name,description FROM tablename LIMIT 25 OFFSET 1000
Ce que j'aimerais savoir, c'est la différence entre les deux.
WHERE column=1
(disons que la colonne a> 100 valeurs différentes)ORDER BY column ASC
(en supposant qu'il a des valeurs aléatoires)S'il s'agit d'une question "stupide" et que quelqu'un connaît des documents éclairant le sujet, veuillez les ajouter dans les réponses.
J'ai l'impression que l'offset saute les X premières lignes trouvées dans la base de données, sans tenir compte du tri et de l'endroit.
En termes de fonctionnement
SELECT id,name,description FROM tablename LIMIT 1000,25
SELECT id,name,description FROM tablename LIMIT 25 OFFSET 1000
il n'y a absolument aucune différence dans les déclarations
Le commentaire de @ siride est exactement le point.
LIMIT 1000,25
veux direLIMIT 25 OFFSET 1000
De la même documentation
LIMIT row_count
est équivalent àLIMIT 0, row_count
- Est-ce que cela fait la même chose ou est-ce que ma compréhension est fausse?
- Est-ce un plus lent/plus rapide dans les grandes tables
Étant donné que les deux requêtes sont les mêmes, il n'y a pas de différence
- Le résultat du décalage change-t-il quand je fais OERE colonne = 1 (disons que la colonne a> 100 valeurs différentes)
- Le résultat du décalage change-t-il lorsque je fais la commande ORDER BY ASC (en supposant qu'il a des valeurs aléatoires)
L'utilisation de LIMIT
ne modifie aucun jeu de résultats. Ils naviguent simplement dans l'ensemble de résultats.
Cette requête
SELECT id,name,description FROM tablename ORDER BY id LIMIT 1000,25
serait différent de
SELECT * FROM (SELECT id,name,description FROM tablename LIMIT 1000,25) A ORDER BY id;
parce que la LIMITE est appliquée à un stade différent.
La première requête ne renvoie rien si le nom de la table contient moins de 1 000 lignes
La deuxième requête ne renvoie rien si la sous-requête comporte moins de 1 000 lignes
Vous devrez sculpter la requête pour vous assurer que vous triez les données au bon stade