2010-08-19 5 views
0

Je veux implémenter mon propre Zend_Paginator_Adapter donc j'ai implémenté Zend_Paginator_Adapter_Interface (docs). Je suis maintenant à la mise en œuvre count(). suis-je raison de dire que si ma requête estZend Framework: Besoin de conseils sur l'implémentation de Zend_Paginator_Adapter count()

SELECT * FROM Posts LIMIT ... // where limit is for pagination purposes 

j'ai besoin pour obtenir le nombre total de lignes dans le tableau (pour revenir en count())?

SELECT COUNT(*) FROM Posts 

il semble inévitable d'avoir 2 requêtes? Je ne suis pas trop préoccupé par mon projet actuel sur la performance, mais le besoin de 2 requêtes, me fait penser, donc je voulais simplement demander ici

Répondre

3

suis-je raison de dire ... pour obtenir le nombre total de lignes dans la table (à retourner dans count())?
SELECT COUNT (*) de messages

Ceci est certainement une façon d'obtenir le résultat que vous recherchez. L'exécution d'une deuxième requête n'est pas si mauvaise en supposant que votre table/index sont optimisés.

Il existe une alternative. Vous pouvez inclure l'instruction "SQL_CALC_FOUND_ROWS" dans votre requête d'origine, puis votre deuxième requête sera constituée uniquement de:

"SELECT FOUND_ROWS();"

Voir le lien suivant pour plus d'informations sur cette fonctionnalité: http://dev.mysql.com/doc/refman/5.0/en/information-functions.html#function_found-rows

Bien sûr, cela suppose que vous utilisez MySQL.

je ne suis pas trop préoccupé par mon projet actuel sur la performance, mais le besoin de 2 requêtes, me fait penser ...

Il est certainement une préoccupation valable d'autant plus que le nombre d'enregistrements commence à augmenter. Ce qui rend Zend_Paginator génial, c'est le fait que vous pouvez injecter une instance de Zend_Cache_Core. Cela garantira que vous n'exécuterez ces requêtes qu'un nombre minimal de fois en fonction de la durée de vie du cache .

Voir la page suivante pour plus d'informations sur les fonctionnalités de mise en cache: http://framework.zend.com/manual/en/zend.paginator.advanced.html#zend.paginator.advanced.caching

+0

quand j'ai essayé 'sélectionner SQL_CALC_FOUND_ROWS * de messages LIMIT 0, 3;' il est revenu 3 rangs. et le nombre total de lignes dans la table est 6. mais 'SELECT FOUND_ROWS()' renvoie toujours 1 –

+0

mise à jour: j'ai trouvé la réponse [ici] (http://www.sitepoint.com/forums/showthread.php?t= 340519). Cela ne fonctionnera pas dans les logiciels comme phpmyadmin/workbench car ils ajoutent des choses aux requêtes –

+0

Le problème avec ceci par phpmyadmin ou workbench est que chaque requête que vous lancez est une toute nouvelle session ... Si vous enchaînez les requêtes avec " " vous allez courir tous les deux dans la même session et voir le bon résultat. –

Questions connexes