Учитывая мой общий выбор ниже, существует ли способ получить количество записей, возвращенных из запроса с помощью Zend Framework? $ row ++ в цикле неприемлемо для моего решения, поскольку я использую подкачку (хотя ее нет в моем примере).
Я также НЕ хочу добавлять другой запрос с помощью «Count (*)».
$query = "Select * from Users where active = 1"; $stmt = $db->query($query); $noOfRows = ???; while ($row = $stmt->fetch()) { // processing }
Использовать 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