Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sqlite/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何从sqlite3获取所选结果的行数?_Sqlite_Count - Fatal编程技术网

如何从sqlite3获取所选结果的行数?

如何从sqlite3获取所选结果的行数?,sqlite,count,Sqlite,Count,我想获得所选行数和所选数据。目前,我必须使用两个sql语句: 一是 select * from XXX where XXX; 另一个是 select count(*) from XXX where XXX; 它可以用一个sql字符串实现吗 我检查了sqlite3的源代码,发现sqlite3的函数发生了变化。但该函数仅在插入、删除或更新后更改数据库时有用 有人能帮我解决这个问题吗?多谢各位 一旦您已经有了select*from XXX结果,您就可以在程序中找到数组长度了,对吗?您可以将它们组

我想获得所选行数和所选数据。目前,我必须使用两个sql语句:

一是

select * from XXX where XXX;
另一个是

select count(*) from XXX where XXX; 
它可以用一个sql字符串实现吗

我检查了sqlite3的源代码,发现sqlite3的函数发生了变化。但该函数仅在插入、删除或更新后更改数据库时有用


有人能帮我解决这个问题吗?多谢各位

一旦您已经有了select*from XXX结果,您就可以在程序中找到数组长度了,对吗?

您可以将它们组合成一条语句:

select count(*), * from XXX where XXX
SELECT
 COUNT(DISTINCT column_name)
FROM
 'table_name';


如果使用而不是prepare/step/finalize,您将在数组结果表中一次获得所有结果,包括列的数量和名称以及行的数量。然后,您应该使用sqlite3_free_table释放结果

SQL不能将从表中选择数据的单行计数和多行结果混合在一起。这是返回大量数据的常见问题。以下是一些处理此问题的技巧:

阅读前N行并告诉用户N行以上的可用行。不是很精确,但通常足够好。如果您保持光标打开,当用户点击视图底部时,您可以获取更多的数据

首先将数据复制到临时表中,而不是直接选择数据。INSERT语句将返回复制的行数。稍后,您可以使用临时表中的数据来显示数据。您可以将行号添加到此临时表中,以使分页更加简单

在后台线程中获取数据。这允许用户在数据网格或表中填充更多数据时使用您的应用程序

这样试试

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

只需尝试。

要获得唯一标题的数量,需要将DISTINCT子句传递给COUNT函数,如下语句所示:

select count(*), * from XXX where XXX
SELECT
 COUNT(DISTINCT column_name)
FROM
 'table_name';

资料来源:

对于那些仍在寻找另一种方法的人,我发现获得行总数的更优雅的方法是使用CTE。 这将确保计数只计算一次:

WITH cnt(total) as (SELECT COUNT(*) from xxx) select * from xxx,cnt
唯一的缺点是,如果需要WHERE子句,那么它应该同时应用于主查询和CTE查询


在第一条评论中,Alttag说运行2个查询没有问题。我不同意这一点,除非两者都是独特交易的一部分。如果不是,则可以通过从另一个线程/进程进行任何插入或删除,在两个查询之间更改源表。在这种情况下,计数值可能是错误的

这只返回行计数和最后一行。我可以。但是直到我遍历所有的结果行。我想尽快得到计数在这种情况下,我想运行两个SQL查询确实是最简单的解决方案。。。谢谢。如果您希望得到行数,那么第一行太复杂了。只需选择COUNT*作为xxx;中的COUNT即可;。这实际上是向输出行添加了一个索引,但在到达最后一行之前,不会对行进行计数,最后一行不比从xxx选择*更好;计算返回sqlite3_行的sqlite3_行的数量,并对输出进行排序,这可能会出乎意料。因此,如果您有90亿行,您希望填满整个内存和硬盘驱动器,只想知道您有多少行?这甚至比使用count+=sqlite3\u step==sqlite3\u ROW执行for循环更糟糕;链接页面说这是一个遗留接口,为向后兼容而保留。不建议使用此界面。虽然答案是肯定的,但下面的大多数答案都增加了您应该避免的复杂性。运行两个查询没有错。如果您在查询之后处理数据,也可以使用所生成的集合对象的计数或大小方法,取决于所使用的语言。我进行查询,然后将每行转换为C++对象并将行添加到C++ STD::vector中。显然,我希望尽可能高效地完成这项工作。如果您首先为正确数量的项保留空间,那么向std::vector添加项的速度会显著加快。因此,首先进行查询以获取计数是毫无意义的,因为它比我通过了解计数节省的成本更有效,而在最后查询我的std::vector也是毫无意义的,因为这样做太晚了。