2009-03-02 12 views
27

que desea obtener el número de filas seleccionadas, así como los datos seleccionados. En la actualidad tengo que usar dos sentencias SQL:Cómo obtener el número de filas del resultado seleccionado de sqlite3?

uno es

select * from XXX where XXX; 

el otro se

select count(*) from XXX where XXX; 

¿Puede ser realizado con una sola cadena SQL?

He comprobado el código fuente de sqlite3, y me encontré con la función de sqlite3_changes(). Pero la función solo es útil cuando se cambia la base de datos (después de insert, delete or update).

¿Puede alguien ayudarme con este problema? ¡Muchas gracias!

+0

Aunque la respuesta es sí, la mayoría de las respuestas a continuación añadir complejidad se debe evitar. No hay nada de malo en ejecutar dos consultas.Si está procesando los datos después de la consulta, también puede usar los métodos 'count()' o 'size()' de su objeto de colección resultante, dependiendo del idioma que esté usando. – alttag

Respuesta

0

Una vez que ya tiene los resultados select * from XXX, que sólo puede encontrar la longitud de la matriz en su derecho programa?

+1

Yo puedo. Pero solo hasta que revise todas las filas de resultados. Quiero obtener el recuento lo más rápido posible – user26404

+2

En ese caso, creo que ejecutar dos consultas SQL realmente es la solución más simple. –

2

Se puede combinar en una sola declaración:

select count(*), * from XXX where XXX 

o

select count(*) as MYCOUNT, * from XXX where XXX 
+3

esto solo devuelve el recuento de filas y solo la última fila. – idursun

+1

sí, no puedo obtener las filas de resultados exactas con este método. – user26404

0

Si utiliza sqlite3_get_table en lugar de prepararse/paso/de finalizar obtendrá todos los resultados a la vez en una matriz ("tabla de resultados"), incluidos los números y nombres de las columnas, y el número de filas. Luego debe liberar el resultado con sqlite3_free_table

+0

Gracias. Voy a intentarlo. – user26404

+3

Entonces, si tiene 9 mil millones de filas, ¿espera llenar su memoria completa y disco duro solo para saber cuántas filas tiene? Esto es incluso peor que hacer un ciclo for con count + = sqlite3_step() == SQLITE3_ROW; – xryl669

13

SQL no puede mezclar resultados de fila única (conteo) y multi-fila (seleccionando datos de sus tablas). Este es un problema común al devolver grandes cantidades de datos. Estos son algunos consejos de cómo manejar esto:

  • leer las primeras N filas y avisar al usuario "más de N filas disponibles". No muy preciso pero a menudo lo suficientemente bueno. Si mantiene el cursor abierto, puede obtener más datos cuando el usuario toca la parte inferior de la vista (Google Reader hace esto)

  • En lugar de seleccionar los datos directamente, primero cópielos en una tabla temporal. La instrucción INSERT devolverá el número de filas copiadas. Más tarde, puede usar los datos en la tabla temporal para mostrar los datos. Puede agregar un "número de fila" a esta tabla temporal para que la búsqueda sea más simple.

  • buscar los datos en un subproceso en segundo plano. Esto le permite al usuario usar su aplicación mientras la tabla o cuadrícula de datos se llena con más datos.

15

tratan de esta manera

select (select count() from XXX) as count, * 
from XXX; 
+0

La primera línea en sí misma funcionó para mí "select (select count() from XXX) como count;" ... Gracias. – samosaris

+3

La primera línea es demasiado compleja si espera obtener el recuento de filas. Simplemente haz "SELECT COUNT (*) AS count FROM xxx;". – xryl669

2
select (select COUNT(0) 
      from xxx t1 
      where t1.b <= t2.b 
      ) as 'Row Number', b from xxx t2 ORDER BY b; 

sólo trato this.

+0

Esto realmente agrega un índice a sus filas de salida, pero no cuenta las filas (hasta que haya llegado a la última fila) que no es mejor que "SELECT * FROM xxx;" y contar el número de sqlite3_row() que devuelve SQLITE3_ROW, y también ordena su resultado, que podría ser inesperado. – xryl669

0

Usted debe intentar esto:

select (select count() from XXX) as count, * from XXX; 
Cuestiones relacionadas