Comment obtenir le nombre de lignes du résultat sélectionné à partir de sqlite3?
Je veux 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:
est
select * from XXX where XXX;
l'autre est
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é (après insert, delete or update
).
Quelqu'un peut m'aider avec ce problème? Merci beaucoup!
- Bien que la réponse est oui, la plupart des réponses ci-dessous ajouter de la complexité que vous devriez éviter. Il n'y a rien de mal avec l'exécution de deux requêtes. Si vous êtes du traitement des données après la requête, vous pouvez également utiliser
count()
ousize()
méthodes de votre objet de collection, en fonction de la langue que vous utilisez. - - Je faire une requête, puis tournez à chaque ligne dans un objet C++ et ajouter les lignes de C++ std::vector. Évidemment, je veux le faire de manière aussi efficace que possible. Et l'ajout d'éléments à un std::vector est nettement plus rapide si vous avez d'abord l'espace de réserve pour le nombre d'articles. Afin de faire une requête pour obtenir le nombre est inutile, parce qu'elle est plus efficace que mes économies de la connaissance de la numération, et l'interrogation de mon std::vector à la fin est également inutile, parce que c'est trop tard pour aider.
Vous devez vous connecter pour publier un commentaire.
essayer de cette façon,
SQL ne peut pas mélanger seule ligne (comptage) et de multi-rangée résultats (sélection des données de vos tables). C'est un problème commun avec le retour des quantités énormes de données. Voici quelques conseils sur la manière de gérer cela:
Lire les N premières lignes et de dire à l'utilisateur "plus de N lignes disponibles". Pas très précis, mais souvent assez bon. Si vous laissez le curseur ouvert, vous pouvez le récupérer plus de données lorsque l'utilisateur appuie sur le bas de la vue (Google Reader ne ce)
Au lieu de sélectionner les données directement, d'abord le copier dans une table temporaire. L'instruction INSERT retourne le nombre de lignes copiées. Plus tard, vous pouvez utiliser les données dans la table temporaire pour afficher les données. Vous pouvez ajouter un "numéro de ligne" à cette table temporaire pour faire de la pagination de plus simple.
De récupérer les données dans un thread d'arrière-plan. Cela permet à l'utilisateur d'utiliser votre application, tandis que la grille de données ou la table se remplit avec plus de données.
juste essayer cette.
Vous pourriez combiner en une seule instruction:
ou
Une fois que vous avez déjà la
select * from XXX
résultats, vous pouvez juste trouver la longueur du tableau dans votre programme?Si vous utilisez
sqlite3_get_table
au lieu de préparer/étape/finaliser, vous obtiendrez tous les résultats à la fois dans un tableau ("résultat de la table"), y compris le nombre et les noms de colonnes et le nombre de lignes. Ensuite, vous devez libérer le résultat avecsqlite3_free_table
Pour obtenir le nombre de titres uniques, vous devez passer la clause DISTINCT de la fonction de COMPTAGE comme la déclaration suivante:
Source: http://www.sqlitetutorial.net/sqlite-count-function/
Pour ceux qui sont toujours à la recherche d'une autre méthode, la plus élégante que j'ai trouvé pour obtenir le total de la ligne est d'utiliser un CTE.
il s'assure que le comte n'est calculée qu'une fois :
le seul inconvénient est que si une clause where est nécessaire, elle devrait être appliquée à la fois de la requête principale et la CTE de la requête.
Dans le premier commentaire, Alttag dit qu'il n'y a pas de problème pour exécuter 2 requêtes. Je ne suis pas d'accord avec ça, sauf si les deux font partie d'une transaction unique. Si non, la table source peut être modifié entre les 2 requêtes par tout les INSÉRER ou de SUPPRIMER à partir d'un autre thread/processus. Dans de tels cas, la valeur de nombre peut être faux.