Limit avec le nombre total d'enregistrements
CrazyCat » 01/ 03/2009 21:30
MySQL
|
Envoyer à un ami |
Fil des commentaires de ce billet
Lorsqu'on fait une requête MySQL avec une clause LIMIT[1], c'est très souvent pour faire une pagination, on a donc besoin de deux requêtes assez gourmandes:
SELECT COUNT(*) AS `total` FROM `table` WHERE `actif`=1 -- renvoie le nombre d'éléments total dans le résultat de la requête SELECT * FROM `table` WHERE `actif`=1 ORDER BY `DATE` DESC LIMIT 10 OFFSET 20 -- renvoie les éléments 21 à 30
La première requête est très gourmande car elle va effectuer la recherche sur toute la table, et la seconde va faire la même recherche en ne renvoyant que certains éléments.
Heureusement, avec une petite option bien placée, on peut avoir sous la main disponible le nombre total d'éléments sans avoir la première requête. En effet, la seconde va de toutes manières sortir tous les éléments qui correspondent, pour n'en garder ensuite que ceux qui satisfont la clause LIMIT. Avec le paramètre SQL_CALC_FOUND_ROWS, on peut garder en mémoire ce total:
SELECT SQL_CALC_FOUND_ROWS * FROM `table` WHERE `actif`=1 ORDER BY `DATE` DESC LIMIT 10 OFFSET 20
Ceci va donc effectuer la requète normale tout en enregistrant dans une table temporaire le nombre total d'enregistrements satisfaisant la clause WHERE sans tenir compte de la clause LIMIT. Il ne reste plus qu'à interroger cette table:
SELECT FOUND_ROWS()
Cette table est très rapide d'accès (elle est en mémoire) et ne demande donc que très peu de ressources.
Notes
[1] La syntaxe que j'utilise ici est la syntaxe officielle, le LIMIT X, Y est un raccourci que je trouve moins agréable