2009-06-11 29 views
7

Dada mi selección genérica a continuación, ¿hay alguna forma de obtener el número de registros devueltos de una consulta con Zend Framework? $ row ++ en un bucle no es aceptable para mi solución ya que estoy usando paginación (aunque no está en mi muestra).¿Hay alguna forma de obtener el número de registros de una consulta con Zend-framework?

También NO deseo agregar otra consulta con "Recuento (*)".

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

$noOfRows = ???; 

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

    // processing 
} 
+0

Sí, he cambiado el título, gracias. – MichaelICE

Respuesta

2

Uso fetchAll()

fetchAll devuelve una matriz, por lo que puede hacer algo como esto:

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

No desacredite a Byron, solo tenga en cuenta, Mike, que esto es muy ineficiente si no está usando datos de todas las filas, y sería mucho mejor ejecutar una consulta adicional para COUNT las filas. –

0

Si va a devolver todo el conjunto de resultados de la consulta SQL, puede haga un fetchAll() en lugar de fetch(), y luego count() la cantidad de elementos en el conjunto devuelto por fetchAll().

Sin embargo, si realiza paginación con una cláusula MySQL LIMIT o equivalente, solo obtendrá el recuento de la cantidad de elementos devueltos para esa consulta (página). No hay manera de obtener la cuenta completa de resultados sin hacer un COUNT() en SQL en este caso. Solo puede hacer cálculos basados ​​en el conjunto de resultados de la base de datos.

12

aún requiere otra consulta, pero con MySQL no es un parámetro SELECT SQL_CALC_FOUND_ROWS - se almacena un valor en su conexión que puede entonces SELECT FOUND_ROWS()

Nota - el rendimiento de su consulta inicial va a bajar, porque el el límite se procesará más tarde, pero puede ser más rápido que un COUNT() separado.

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()'); 
0

Kekoa está mal.

Si coloca ese SQL_CALC_FOUND_ROWS y luego, si pone un límite obtendrá el número completo de filas (no se ve afectado por el límite).

Si tiene una tabla simple, se recomienda utilizar count (*) en la paginación porque es mucho más rápida, pero si tiene consultas complejas y sus datos son el resultado de muchas combinaciones, mi consejo es usa SQL_CALC_FOUND_ROWS.

Espero que esto te ayude.

BornForCode

1

Es extraño, pero esto sólo funciona:

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

debo mencionar que yo uso esta línea en mi fichero de configuración:

db.profiler.enabled = true 

Aquí hay un código de ideas de pluma; sin embargo, no funciona:

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

también echar un vistazo a http://old.nabble.com/RE:-CALC_FOUND_ROWS-vs.-count%28 * 29%-p16761518.html

Cuestiones relacionadas