2009-06-15 15 views
0

私は次のコードカウントmysqlのクエリ


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

しかし、私は戻って1件の結果を得る..ここます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] =>))

私はCOUNTコントローラを削除すると、Iをすべてのアイテムを元に戻す。 どのようにしてクエリ全体(LIMITを超えて)をカウントすることもできますし、クエリ全体を戻すこともできますか?

ありがとうございました。

+0

FWIW、この問題は、Zend Frameworkのに特定ではありません。 SQL問合せでの集約関数の使用に関する問題です。 1つのクエリでは、集計または集計前のデータ行を取得できますが、両方を取得することはできません。 –

+0

これは[別の質問](http://stackoverflow.com/questions/983419/is-there-a-way-to-get-the-number-of-records-from-a-query-with- zend-framework/984283#984283)私は答えました。 – Justin

答えて

1

最も効率的な方法は、この場合は2つのクエリを実行することです。

4

MySQL 4.0.0以降、SQL_CALC_FOUND_ROWSを使用すると、MySQLにLIMIT句を無視した行の総数をカウントさせることができます。行数を取得するために2番目のクエリを実行する必要がありますが、格納された行数を取得するだけの簡単なクエリです。

使い方はかなりシンプルです。あなたは主なクエリでは、SELECTの直後にSQL_CALC_FOUND_ROWSオプションを追加する必要がありますし、2番目のクエリでは、FOUND_ROWS()関数を使用して合計行数を取得する必要があります。クエリは次のようになります。

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

SELECT FOUND_ROWS(); 

唯一の制限は、SQL_CALC_FOUND_ROWSはどこにでも行数を保存していないので、あなたがすぐに最初の1の後に2番目のクエリを呼び出す必要があるということです。 (this postからコピー)

+0

興味深い記事で、私はSQL_CALC_FOUND_ROWSを認識していませんでした。引用された記事のコメントでは、大量のクエリではなくFOUND_ROWS()を呼び出すのは間違いありませんが、完全な行セットがまだ計算されている(つまりLIMIT最適化は行われていない)ので、 –