Есть ли способ получить количество записей из запроса с Zend-framework? - PullRequest
7 голосов
/ 12 июня 2009

Учитывая мой общий выбор ниже, есть ли способ получить количество записей, возвращаемых по запросу с Zend Framework? $ row ++ в цикле неприемлемо для моего решения, так как я использую пейджинг (хотя его нет в моем примере).

Я также НЕ хочу добавлять еще один запрос с "Count (*)".

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

$noOfRows = ???;

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

  // processing
}

Ответы [ 5 ]

13 голосов
/ 12 июня 2009

Требуется еще один запрос, но в 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()');
2 голосов
/ 12 июня 2009

Использовать fetchAll ()

fetchAll возвращает массив, поэтому вы можете сделать что-то вроде этого:

$rows = $db->fetchAll("select ...");
$numRows = sizeof($rows);
foreach ($rows as $row)
{
  // process each row
}
1 голос
/ 08 февраля 2010

Странно, но это работает:

$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

0 голосов
/ 13 сентября 2009

Кекоа не прав.

Если вы установите этот SQL_CALC_FOUND_ROWS, а затем, если вы установите ограничение, вы получите полное количество строк (ограничение не влияет).

Если у вас есть простая таблица, то рекомендуется использовать счетчик (*) в разбивке на страницы, поскольку он выполняется намного быстрее, но если у вас сложные запросы, а ваши данные являются результатом множества объединений и т. Д., То я советую использовать SQL_CALC_FOUND_ROWS.

Надеюсь, это вам поможет.

BornForCode

0 голосов
/ 12 июня 2009

Если вы возвращаете весь набор результатов в своем запросе SQL, вы можете сделать fetchAll() вместо fetch(), а затем count() количество элементов в массиве, возвращаемое из fetchAll().

Однако, если вы делаете пейджинг с предложением MySQL LIMIT или его эквивалентом, вы получите только количество элементов, возвращаемых для этого запроса (страницы). В этом случае невозможно получить полный подсчет результатов без выполнения COUNT() в SQL. Вы можете выполнять расчеты только на основе результатов из базы данных.

...