2009-06-15 7 views
0

je le code suivantcomptage mysql requête


$result = $handle->select()->from('store_products_id', array('count'=>'COUNT(store_products_id.product_id)')) 
             ->where('store_products_id.store_id=?', $this->store_id) 
             ->columns($selectColumns) 
             ->join('product_quickinfo', 'store_products_id.product_id = 
               product_quickinfo.product_id') 

             ->join('image_paths', 'product_quickinfo.image_id = 
               image_paths.image_id') 

             ->order('product_quickinfo.date_created DESC') 
             ->limitPage($this->page_number, $this->sum_each_page) 
             ->query(ZEND_DB::FETCH_OBJ); 

Cependant, je ne reçoivent que l'un résultat .. voici un coup d'oeil à la print_r:


Array ([0] => stdClass Object ([count] => 14 [small_path] => 1 [product_name] => v evrecvrv [price] => 22 [product_id] => 1 [image_id] => 1 [date_created] => 0000-00-00 00:00:00 [large_path] => [description] =>))

Lorsque je supprime le contrôleur COUNT, je récupère tous les objets. Comment puis-je compter la totalité de la requête (au-delà de la LIMITE que j'impose) et récupérer la totalité de la requête?

Merci.

+0

FWIW, cette question n'est pas particulièrement Zend Framework. C'est un problème avec l'utilisation de fonctions d'agrégation dans les requêtes SQL. Dans une seule requête, vous pouvez obtenir l'agrégat ou les lignes de données pré-agrégées, mais pas les deux. –

+0

Ceci est similaire à [une autre question] (http://stackoverflow.com/questions/983419/is-there-a-way-to-get-the-number-of-records-from-a-query-with- zend-framework/984283 # 984283) que j'ai répondu. – Justin

Répondre

1

Le moyen le plus efficace consiste simplement à exécuter deux requêtes, dans ce cas.

4

Depuis MySQL 4.0.0, vous pouvez utiliser SQL_CALC_FOUND_ROWS dans votre requête, ce qui indiquera à MySQL de compter le nombre total de lignes sans tenir compte de la clause LIMIT. 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 qui récupère simplement le nombre de lignes stockées.

L'utilisation est assez simple. Dans votre requête principale, vous devez ajouter l'option SQL_CALC_FOUND_ROWS juste après SELECT et dans la deuxième requête, vous devez utiliser la fonction FOUND_ROWS() pour obtenir le nombre total de lignes. Les requêtes se présenterait comme suit:

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

SELECT FOUND_ROWS(); 

La seule limite est que vous devez appeler la deuxième requête immédiatement après la première, car SQL_CALC_FOUND_ROWS ne sauve pas le nombre de lignes partout.

(Copié this post)

+0

Article intéressant, je n'étais pas au courant de SQL_CALC_FOUND_ROWS. Les commentaires dans l'article cité suggèrent qu'il n'est plus performant, car l'ensemble de lignes complet est toujours calculé (c'est-à-dire sans optimisation de LIMIT), bien qu'il soit nettement plus intéressant d'appeler FOUND_ROWS() plutôt qu'une grosse requête. –