2009-06-15 16 views
0

Ich habe den folgenden CodeZählen mysql query


$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); 

Allerdings bekomme ich nur ein Ergebnis zurück .. hier ist ein Blick auf die 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] =>))

Wenn ich die COUNT-Controller zu entfernen, I hol dir alle Gegenstände zurück. Wie kann ich die gesamte Abfrage zählen (über die LIMIT, die ich auferlege) und auch die gesamte Abfrage zurück erhalten?

Danke.

+0

FWIW, ist dieses Problem nicht besonders auf Zend Framework. Es ist ein Problem bei der Verwendung von Aggregatfunktionen in SQL-Abfragen. In einer einzelnen Abfrage können Sie entweder die aggregierten oder die voraggregierten Datenzeilen abrufen, jedoch nicht beide. –

+0

Dies ist ähnlich zu [eine andere Frage] (http://stackoverflow.com/questions/983419/is-there-a-way-to-get-the-number-of-records-from-a-query-with- zend-framework/984283 # 984283) antwortete ich. – Justin

Antwort

1

Der effizienteste Weg besteht darin, in diesem Fall einfach zwei Abfragen auszuführen.

4

Seit MySQL 4.0.0 können Sie SQL_CALC_FOUND_ROWS in Ihrer Abfrage verwenden, wodurch MySQL die Gesamtzahl der Zeilen ohne Berücksichtigung der LIMIT-Klausel zählt. Sie müssen noch eine zweite Abfrage ausführen, um die Anzahl der Zeilen abzurufen, aber es handelt sich um eine einfache Abfrage, die nur die Anzahl der gespeicherten Zeilen abruft.

Die Verwendung ist ziemlich einfach. In Ihrer Hauptabfrage müssen Sie die Option SQL_CALC_FOUND_ROWS direkt nach SELECT hinzufügen, und in der zweiten Abfrage müssen Sie die Funktion FOUND_ROWS() verwenden, um die Gesamtanzahl der Zeilen zu erhalten. Abfragen würden wie folgt aussehen:

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

SELECT FOUND_ROWS(); 

Die einzige Einschränkung ist, dass Sie zweite Abfrage unmittelbar nach dem ersten Anruf muss, weil SQL_CALC_FOUND_ROWS Anzahl der Zeilen nicht überall speichern.

(Kopiert von this post)

+0

Interessanter Artikel, mir war SQL_CALC_FOUND_ROWS nicht bekannt. Die Kommentare in dem zitierten Artikel legen nahe, dass es nicht leistungsfähiger ist, da der vollständige Zeilensatz immer noch berechnet wird (d. H. Keine LIMIT-Optimierung), obwohl es besser ist, FOUND_ROWS() als eine große Abfrage erneut aufzurufen. –