2009-03-02 6 views
27

Je souhaite obtenir le nombre de lignes sélectionnées ainsi que les données sélectionnées. À l'heure actuelle, je dois utiliser deux instructions SQL:Comment obtenir le nombre de lignes du résultat sélectionné depuis sqlite3?

un est

select * from XXX where XXX; 

l'autre

select count(*) from XXX where XXX; 

Peut-il être réalisé avec une seule chaîne sql?

J'ai vérifié le code source de sqlite3, et j'ai trouvé la fonction de sqlite3_changes(). Mais la fonction n'est utile que lorsque la base de données est modifiée (après insert, delete or update).

Quelqu'un peut-il m'aider avec ce problème? Merci beaucoup!

+0

Bien que la réponse est oui, la plupart des réponses ci-dessous ajouter la complexité, vous devez éviter. Il n'y a rien de mal à exécuter deux requêtes.Si vous traitez les données après la requête, vous pouvez également utiliser les méthodes 'count()' ou 'size()' de votre objet de collection résultant, selon la langue que vous utilisez. – alttag

Répondre

0

Une fois que vous avez déjà les résultats select * from XXX, vous pouvez simplement trouver la longueur du tableau dans votre programme, n'est-ce pas?

+1

Je peux. Mais seulement jusqu'à ce que je passe par toutes les lignes de résultat. Je veux obtenir le compte aussi rapidement que possible – user26404

+2

Dans ce cas, je suppose que l'exécution de deux requêtes SQL est vraiment la solution la plus simple. –

2

Vous pouvez les combiner en une seule instruction:

select count(*), * from XXX where XXX 

ou

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

cela ne renvoie que le nombre de lignes et seulement la dernière ligne. – idursun

+1

oui, je ne peux pas obtenir les lignes de résultats exactes en utilisant cette méthode. – user26404

0

Si vous utilisez sqlite3_get_table au lieu de préparer/étape/finalisez vous obtiendrez tous les résultats à la fois dans un tableau ("table de résultats"), y compris les nombres et les noms des colonnes, et le nombre de lignes. Vous devez ensuite libérer le résultat avec sqlite3_free_table

+0

Merci. Je vais essayer. – user26404

+3

Donc, si vous avez 9 milliards de lignes, vous vous attendez à remplir votre mémoire complète et votre disque dur juste pour savoir combien de lignes vous avez? C'est encore pire que de faire une boucle for avec count + = sqlite3_step() == SQLITE3_ROW; – xryl669

13

SQL ne peut pas mélanger les résultats à une seule ligne (comptant) et à plusieurs lignes (sélection des données de vos tables). C'est un problème commun avec le retour d'énormes quantités de données. Voici quelques conseils pour gérer ceci:

  • Lisez les N premières lignes et dites à l'utilisateur "plus de N lignes disponibles". Pas très précis mais souvent assez bon. Si vous gardez le curseur ouvert, vous pouvez récupérer plus de données lorsque l'utilisateur atteint le bas de la vue (Google Reader fait cela)

  • Au lieu de sélectionner les données directement, copiez-les d'abord dans une table temporaire. L'instruction INSERT renvoie le nombre de lignes copiées. Plus tard, vous pouvez utiliser les données de la table temporaire pour afficher les données. Vous pouvez ajouter un "numéro de ligne" à cette table temporaire pour rendre la pagination plus simple.

  • Récupère les données dans un fil d'arrière-plan. Cela permet à l'utilisateur d'utiliser votre application pendant que la grille ou le tableau de données contient plus de données.

15

essayer cette façon

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

La première ligne par elle-même a fonctionné pour moi "select (select count() de XXX) comme compte;" ... Merci. – samosaris

+3

La première ligne est trop complexe si vous prévoyez d'obtenir le nombre de lignes. Faites simplement "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; 

juste essayer this.

+0

Cela ajoute en fait un index à vos lignes de sortie, mais ne compte pas les lignes (jusqu'à ce que vous ayez atteint la dernière ligne) ce qui n'est pas mieux que "SELECT * FROM xxx;" et en comptant le nombre de sqlite3_row() retournant SQLITE3_ROW, et il triera également votre sortie qui pourrait être inattendue. – xryl669

0

Vous devriez essayer ceci:

select (select count() from XXX) as count, * from XXX; 
Questions connexes