Есть ли способ получить количество записей из запроса с помощью Zend-framework?

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

Я также НЕ хочу добавлять другой запрос с помощью «Count (*)».

$query = "Select * from Users where active = 1"; $stmt = $db->query($query); $noOfRows = ???; while ($row = $stmt->fetch()) { // processing } 

Solutions Collecting From Web of "Есть ли способ получить количество записей из запроса с помощью Zend-framework?"

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

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

 $rows = $db->fetchAll("select ..."); $numRows = sizeof($rows); foreach ($rows as $row) { // process each row } 

Он по-прежнему требует другого запроса, но с 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()'); 

Это странно, но это просто работает:

 $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

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

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

Кекоа ошибается.

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

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

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

BornForCode