web-dev-qa-db-fra.com

Trouver le nombre total de résultats dans la requête mySQL avec offset + limite

Je fais une fonctionnalité de pagination en utilisant Codeigniter mais je pense que cela s'applique au codage PHP/mySQL en général.

Je récupère les listes de répertoires en utilisant le décalage et la limite en fonction du nombre de résultats que je veux par page. Cependant pour connaître le nombre total de pages nécessaires, j'ai besoin de savoir (nombre total de résultats)/(limite). En ce moment, je pense à exécuter la requête SQL une deuxième fois, puis à compter le nombre de lignes requises, mais sans utiliser LIMIT. Mais je pense que cela semble être un gaspillage de ressources informatiques.

Y a-t-il de meilleures façons? Merci!

EDIT: Ma requête SQL utilise également WHERE pour sélectionner toutes les lignes avec un 'category_id' particulier

45
Nyxynyx

Jetez un oeil à SQL_CALC_FOUND_ROWS

32
Dr.Molle

SELECT COUNT(*) FROM table_name WHERE column = 'value' renverra très rapidement le nombre total d'enregistrements dans une table correspondant à cette condition.

Les opérations de base de données SELECT sont généralement "bon marché" (en termes de ressources), donc ne vous sentez pas trop mal de les utiliser de manière raisonnable.

EDIT: Ajout de WHERE après que l'OP ait mentionné qu'ils avaient besoin de cette fonctionnalité.

6
Austin

Considérant que SQL_CALC_FOUND_ROWS nécessite l'appel de FOUND_ROWS() par la suite, si vous vouliez récupérer le nombre total avec les résultats revenu de votre limite sans avoir à invoquer un second SELECT, j'utiliserais JOIN résultats dérivés d'une sous-requête :

SELECT * FROM `table` JOIN (SELECT COUNT(*) FROM `table` WHERE `category_id` = 9) t2 WHERE `category_id` = 9 LIMIT 50

Remarque: Chaque table dérivée doit avoir son propre alias, assurez-vous donc de nommer la table jointe. Dans mon exemple, j'ai utilisé t2.

3
Daerik

Le modificateur de requête SQL_CALC_FOUND_ROWS et la fonction FOUND_ROWS () qui l'accompagne sont obsolètes à partir de MySQL 8.0.17 et seront supprimés dans une future version de MySQL. En remplacement, envisagez d'exécuter votre requête avec LIMIT, puis une deuxième requête avec COUNT (*) et sans LIMIT pour déterminer s'il existe des lignes supplémentaires. Par exemple, au lieu de ces requêtes:

SELECT SQL_CALC_FOUND_ROWS * FROM tbl_name WHERE id > 100 LIMIT 10;
SELECT FOUND_ROWS();

Utilisez plutôt ces requêtes:

SELECT * FROM tbl_name WHERE id > 100 LIMIT 10;
SELECT COUNT(*) WHERE id > 100;

COUNT (*) est soumis à certaines optimisations. SQL_CALC_FOUND_ROWS entraîne la désactivation de certaines optimisations.

1
Tamil