99 votes

Obtenir le nombre total de lignes en utilisant LIMIT ?

Duplicata possible :
Trouver le nombre total de résultats dans une requête mySQL avec offset+limite

J'ai une requête sql très complexe qui renvoie des résultats qui sont paginés. Le problème est que pour obtenir le nombre total de lignes avant la clause LIMIT, je dois exécuter la requête deux fois. La première fois sans la clause limit pour obtenir le nombre total de lignes. La requête est vraiment complexe et je pense qu'il doit y avoir un meilleur moyen de faire cela sans exécuter la requête deux fois.

123voto

Heureusement depuis MySQL 4.0.0 vous pouvez utiliser SQL_CALC_FOUND_ROWS dans votre requête qui indiquera à MySQL de compter le nombre total de lignes sans tenir compte de LIMIT clause. Vous devez toujours exécuter une deuxième requête afin de récupérer le nombre de lignes, mais il s'agit d'une requête simple et pas aussi complexe que votre requête qui a récupéré les données. L'utilisation est assez simple. Dans votre requête principale, vous devez ajouter SQL_CALC_FOUND_ROWS juste après l'option SELECT et dans la deuxième requête, vous devez utiliser FOUND_ROWS() pour obtenir le nombre total de lignes. Les requêtes ressembleraient à ceci :

SELECT SQL_CALC_FOUND_ROWS name, email FROM users WHERE name LIKE 'a%' LIMIT 10;

SELECT FOUND_ROWS();

La seule limitation est que vous devez appeler la deuxième requête immédiatement après la première car SQL_CALC_FOUND_ROWS n'enregistre le nombre de lignes nulle part. Bien que cette solution nécessite également deux requêtes, elle est beaucoup plus rapide, car vous n'exécutez la requête principale qu'une seule fois. Vous pouvez en savoir plus sur SQL_CALC_FOUND_ROWS et FOUND_ROWS() dans la documentation de MySQL.

EDIT : Vous devez noter que, dans la plupart des cas, exécuter la requête deux fois est plus rapide que SQL_CALC_FOUND_ROWS . voir aquí

EDIT 2019 :

Le modificateur de requête SQL_CALC_FOUND_ROWS et la fonction FOUND_ROWS() qui l'accompagne sont obsolètes depuis MySQL 8.0.17 et seront supprimés dans une prochaine version de MySQL.

https://dev.mysql.com/doc/refman/8.0/en/information-functions.html#function_found-rows

Il est recommandé d'utiliser COUNT au lieu de

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X