Cours SQL et MySQL · Module 2: Interroger les données (SELECT)

OFFSET et la pagination

4 min de lecture
Dans cette leçon6

Le marchand de Rhodes est revenu avec une nouvelle demande : il veut parcourir tout le catalogue sur sa tablette de cire, cinq titres à la fois, comme les pages d'un livre. LIMIT seul prend toujours les premières lignes. Mais que faire si tu veux la deuxième page du catalogue - les cinq livres suivants après les cinq premiers ? C'est là qu'intervient OFFSET.

Les pages du catalogue

Rangeons tous les titres par ordre alphabétique et répartissons-les en pages de 5 entrées. Dix-sept parchemins donnent trois pages pleines et une plus courte :

PagePositionsTitresLIMITOFFSET
11-5Ajaks, Antygona, Dziady, Elementy, Etyka50
26-10Fajdros, Hamlet, Iliada, Krzyżacy, Medea55
311-15Odyseja, Pan Tadeusz, Państwo, Polityka, Potop510
416-17Tom Sawyer, Uczta515

La colonne OFFSET indique combien de lignes sauter avant le début d'une page : la première ne saute rien, la deuxième saute les cinq parchemins de la première, la troisième en saute dix. LIMIT vaut toujours 5, car c'est la taille de la page. La dernière page n'a que deux entrées, car il ne reste que deux parchemins.

OFFSET - sauter des lignes

OFFSET indique combien de lignes sauter avant de commencer à compter. Voici comment obtenir la troisième page du catalogue :

1SELECT tytul
2FROM ksiazki
3ORDER BY tytul ASC
4LIMIT 5 OFFSET 10;

Ici, nous sautons 10 parchemins et prenons les 5 suivants (c'est-à-dire les positions 11 à 15) :

tytul
Odyseja
Pan Tadeusz
Państwo
Polityka
Potop

C'est exactement la troisième page du tableau ci-dessus. Voilà ce qu'est la pagination - le découpage d'une longue liste en pages.

Une formule pour la page

Inutile de compter sur tes doigts. La formule est simple, et tu peux l'écrire en commentaire dans la requête :

1-- OFFSET = (numero_page - 1) * taille_page
2SELECT tytul FROM ksiazki ORDER BY tytul ASC LIMIT 5 OFFSET 5;

Ce qui précède montre la deuxième page (nous sautons les 5 premiers et prenons les 5 suivants) :

tytul
Fajdros
Hamlet
Iliada
Krzyżacy
Medea

Pour la troisième page, la formule donne (3 - 1) * 5 = 10, et pour la quatrième (4 - 1) * 5 = 15. Seul OFFSET change, LIMIT reste le même.

La pagination exige ORDER BY

Remarque que chaque requête de cette leçon a un ORDER BY. Ce n'est pas un hasard. Sans ordre fixé, la Bibliothèque peut donner les parchemins dans un ordre différent à chaque requête. Alors « sauter les dix premiers » n'a plus de sens stable : le même titre peut tomber sur deux pages, et un autre n'apparaître sur aucune. C'est pourquoi on pagine toujours une liste triée, de préférence selon un champ sans égalités, comme id.

L'écriture avec une virgule

Dans le code des autres, tu rencontreras aussi un raccourci que MySQL accepte à la place du mot OFFSET :

1SELECT tytul FROM ksiazki ORDER BY tytul ASC LIMIT 10, 5;

Le résultat est le même qu'avec LIMIT 5 OFFSET 10 :

tytul
Odyseja
Pan Tadeusz
Państwo
Polityka
Potop

Attention à l'ordre des nombres : dans l'écriture avec une virgule, le nombre de lignes à sauter vient d'abord, et le nombre de lignes à afficher ensuite - l'inverse de l'écriture avec OFFSET. On s'y trompe facilement ; c'est pourquoi j'écris toujours LIMIT … OFFSET … - et c'est ce que je te recommande.

L'ordre des clauses et les erreurs courantes

Nous ajoutons OFFSET après LIMIT, tout à la fin de la requête. L'ordre complet est : SELECT → FROM → ORDER BY → LIMIT → OFFSET. Deux erreurs sont les plus fréquentes :

  • Des nombres inversés. LIMIT 10 OFFSET 5 saute cinq lignes et en affiche dix - au lieu d'une page, tu en obtiens deux collées ensemble. LIMIT est la taille de la page, OFFSET le nombre de lignes sautées.
  • OFFSET sans LIMIT. Dans MySQL, OFFSET 10 seul, sans LIMIT, est une erreur de syntaxe. OFFSET va toujours de pair avec LIMIT.

Grâce à la pagination, même le plus long catalogue tient confortablement à l'écran - page par page, parchemin par parchemin.

Tu as repéré une erreur dans cette leçon ?

Teste tes connaissances

Réponds aux questions de cette leçon. Choisis une réponse pour voir tout de suite si elle est correcte.

  1. 1. Que va renvoyer la clause LIMIT 5 OFFSET 10 (avec un ordre de tri fixe) ?

  2. 2. Avec 5 entrées par page, quel OFFSET faut-il donner pour afficher la troisième page de résultats ?

Tâches pratiques dans le jeu

  • Éditeur de code

    Écris une requête qui récupère toutes les colonnes de la table czytelnicy, trie les lignes par id, saute les 10 premières et affiche les 5 suivantes (utilise ORDER BY, LIMIT et OFFSET).

  • Clique dans l'ordre

    Clique sur les éléments dans l'ordre où tu écrirais la fin de requête qui récupère la deuxième page de 5 lignes :

  • Éditeur de code

    Écris une requête qui récupère la colonne tytul de la table ksiazki, trie par titre croissant et affiche la deuxième page de 5 entrées (saute 5 lignes, affiche les 5 suivantes).