7

以下の一般的な選択を考えると、Zend Framework でクエリから返されたレコード数を取得する方法はありますか? ページングを使用しているため、ループ内の $row++ は私のソリューションでは受け入れられません (ただし、サンプルにはありません)。

また、「Count(*)」を使用して別のクエリを追加したくありません。

$query = "Select * from Users where active = 1";
$stmt = $db->query($query);

$noOfRows = ???;

while ($row = $stmt->fetch())
{

  // processing
}
4

5 に答える 5

13

それでも別のクエリが必要ですが、MySQL には SELECT パラメータがあります。これはSQL_CALC_FOUND_ROWS、接続に値を保存します。SELECT FOUND_ROWS()

注 - 制限は後で処理されるため、最初のクエリのパフォーマンスは低下しますが、別の COUNT() よりも高速になる可能性があります。

FOUND_ROWS()

$query = "Select SQL_CALC_FOUND_ROWS * from Users where active = 1 limit 20";
$stmt = $db->query($query);

while ($row = $stmt->fetch())
{

  // processing
}

$count = $db->fetchOne('SELECT FOUND_ROWS()');
于 2009-06-11T23:17:22.490 に答える
2

fetchAll() を使用する

fetchAll は配列を返すため、次のようなことができます。

$rows = $db->fetchAll("select ...");
$numRows = sizeof($rows);
foreach ($rows as $row)
{
  // process each row
}
于 2009-06-11T20:32:51.997 に答える
1

奇妙ですが、これはうまくいきます:

$oSelect = $oTable->select()
                ->where(...)
                ->order(...)
                ->limit(...)
$oRows = $oTable->fetchAll($oSelect);
// these two lines are the solution: we simply run the query again!
$db->query($oSelect);
$iTotal = $db->fetchOne("select FOUND_ROWS()");

私は私の設定ファイルでこの行を使用していることに言及する必要があります:

db.profiler.enabled = true

これが羽のアイデアのコードです。ただし、機能しません。

$query = $db->select()
->from('your_table', array(new Zend_Db_Expr('SQL_CALC_FOUND_ROWS id as fake_column'),'*'))
->where(...)
->limit(0, 10);

$db->query($query);

$iCount = $db->fetchOne('select FOUND_ROWS()');

http://old.nabble.com/RE:-CALC_FOUND_ROWS-vs.-count%28 *%29-p16761518.htmlもご覧ください。

于 2010-02-07T23:27:00.320 に答える
0

ケコアは間違っています。

そのSQL_CALC_FOUND_ROWSを設定し、次に制限を設定すると、行の全数が取得されます(制限の影響を受けません)。

単純なテーブルがある場合は、ページネーションでcount(*)を使用することをお勧めします。これは、はるかに高速であるためですが、複雑なクエリがあり、データが多くの結合などの結果である場合は、SQL_CALC_FOUND_ROWSを使用することをお勧めします。

これがお役に立てば幸いです。

BornForCode

于 2009-09-13T13:32:14.543 に答える
0

SQL クエリで結果セット全体を返す場合は、 a のfetchAll()代わりに afetch()を実行しcount()てから、 から返された配列内の項目の数を実行できますfetchAll()

ただし、MySQLLIMIT句または同等のものを使用してページングを行っている場合は、そのクエリ (ページ) に対して返されたアイテム数のカウントのみが取得されます。COUNT()この場合、in SQLを実行せずに結果の総数を取得する方法はありません。データベースからの結果セットに基づいてのみ計算を行うことができます。

于 2009-06-11T20:33:30.293 に答える