2009-03-02 13 views
27

Desidero ottenere il numero di righe selezionate e anche i dati selezionati. Attualmente devo usare due istruzioni SQL:Come ottenere il numero di righe del risultato selezionato da sqlite3?

uno è

select * from XXX where XXX; 

l'altro è

select count(*) from XXX where XXX; 

Può essere realizzata con una singola stringa sql?

Ho controllato il codice sorgente di sqlite3 e ho trovato la funzione di sqlite3_changes(). Ma la funzione è utile solo quando il database viene modificato (dopo insert, delete or update).

Qualcuno può aiutarmi con questo problema? Grazie mille!

+0

Anche se la risposta è sì, la maggior parte delle risposte di seguito aggiungere complessità si dovrebbe evitare. Non c'è niente di sbagliato nell'esecuzione di due query.Se stai elaborando i dati dopo la query, puoi anche utilizzare i metodi 'count()' o 'size()' dell'oggetto di raccolta risultante, a seconda della lingua che stai utilizzando. – alttag

risposta

0

Una volta che si hanno già i risultati select * from XXX, si può semplicemente trovare la lunghezza dell'array nel programma giusto?

+1

Posso. Ma solo finché avrò attraversato tutte le righe dei risultati. Voglio ottenere il conteggio il più rapidamente possibile – user26404

+2

In tal caso, suppongo che l'esecuzione di due query SQL sia davvero la soluzione più semplice. –

2

loro È possibile combinare in una singola istruzione:

select count(*), * from XXX where XXX 

o

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

restituisce solo il conteggio delle righe e solo l'ultima riga. – idursun

+1

sì, non riesco a ottenere le righe del risultato esatto usando questo metodo. – user26404

0

Se si utilizza sqlite3_get_table invece di preparare/step/finalizzare si ottengono tutti i risultati in una sola volta in un array ("tabella dei risultati"), compresi i numeri e i nomi delle colonne e il numero di righe. Quindi è necessario liberare il risultato con sqlite3_free_table

+0

Grazie. Ci proverò. – user26404

+3

Quindi, se hai 9 miliardi di righe, ti aspetti di riempire la tua memoria completa e il tuo disco rigido solo per sapere quante righe hai? Questo è anche peggio che fare un ciclo for con count + = sqlite3_step() == SQLITE3_ROW; – xryl669

13

SQL non è in grado di combinare risultati su una riga singola (conteggio) e su più righe (selezionando i dati dalle tabelle). Questo è un problema comune con il ritorno di enormi quantità di dati. Ecco alcuni suggerimenti su come gestirlo:

  • Leggere le prime N righe e indicare all'utente "più di N righe disponibili". Non molto preciso ma spesso abbastanza buono. Se si tiene aperto il cursore, è possibile recuperare più dati quando l'utente tocca la parte inferiore della visualizzazione (Google Reader)

  • Invece di selezionare direttamente i dati, copiarli prima in una tabella temporanea. L'istruzione INSERT restituirà il numero di righe copiate. Successivamente, è possibile utilizzare i dati nella tabella temporanea per visualizzare i dati. È possibile aggiungere un "numero di riga" a questa tabella temporanea per rendere più semplice il paging.

  • Scarica i dati in un thread in background. Ciò consente all'utente di utilizzare l'applicazione mentre la griglia o la tabella dei dati si riempiono di più dati.

15

provare in questo modo

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

La prima riga ha funzionato per me "seleziona (seleziona count() da XXX) come conteggio;" ... Grazie. – samosaris

+3

La prima riga è eccessivamente complessa se si prevede di ottenere il conteggio delle righe. Basta fare "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; 

basta provare this.

+0

In realtà aggiunge un indice alle righe di output, ma non conta le righe (finché non hai raggiunto l'ultima riga) che non è migliore di "SELECT * FROM xxx;" e contando il numero di sqlite3_row() che restituisce SQLITE3_ROW, e ordina anche l'output che potrebbe essere inaspettato. – xryl669

0

Si dovrebbe provare questo:

select (select count() from XXX) as count, * from XXX; 
Problemi correlati