37

我想获取所选行数以及所选数据。目前我要使用两条sql语句:

一个是

select * from XXX where XXX;

另一个是

select count(*) from XXX where XXX; 

可以用单个sql字符串实现吗?

我查看了 sqlite3 的源代码,发现了sqlite3_changes(). 但该功能仅在数据库更改时(之后insert, delete or update)才有用。

谁能帮我解决这个问题?非常感谢!

4

9 回答 9

15

试试这个方法

select (select count() from XXX) as count, * 
from XXX;
于 2011-04-06T09:22:45.397 回答
13

SQL 不能混合单行(计数)和多行结果(从表中选择数据)。这是返回大量数据的常见问题。以下是一些如何处理此问题的提示:

  • 读取前 N 行并告诉用户“有超过 N 行可用”。不是很精确,但通常足够好。如果您保持光标打开,您可以在用户点击视图底部时获取更多数据(谷歌阅读器这样做)

  • 与其直接选择数据,不如先将其复制到临时表中。INSERT 语句将返回复制的行数。稍后,您可以使用临时表中的数据来显示数据。您可以在这个临时表中添加一个“行号”以使分页更简单。

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

于 2009-03-02T10:10:27.790 回答
2
select (select COUNT(0) 
            from xxx t1 
            where t1.b <= t2.b 
            ) as 'Row Number', b from xxx t2 ORDER BY b; 

试试这个

于 2012-05-31T02:34:50.983 回答
1

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

select count(*), * from XXX where XXX

或者

select count(*) as MYCOUNT, * from XXX where XXX
于 2009-03-02T08:20:11.177 回答
0

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

于 2009-03-02T08:18:26.703 回答
0

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

WITH cnt(total) as (SELECT COUNT(*) from xxx) select * from xxx,cnt

唯一的缺点是如果需要 WHERE 子句,它应该在主查询和 CTE 查询中应用。

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

于 2019-09-26T01:44:23.397 回答
0

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

SELECT
 COUNT(DISTINCT column_name)
FROM
 'table_name';

来源:http ://www.sqlitetutorial.net/sqlite-count-function/

于 2019-03-27T09:58:17.800 回答
0
int rows_count = 0;

while (sqlite3_step(stmt) == SQLITE_ROW)
{
    rows_count++;
}

// The rows_count is available for use

sqlite3_reset(stmt);  // reset the stmt for use it again

while (sqlite3_step(stmt) == SQLITE_ROW)
{
    
    // your code in the query result

}
于 2021-11-16T12:52:50.197 回答
-1

如果您使用sqlite3_get_table而不是准备/步骤/完成,您将在一个数组(“结果表”)中一次获得所有结果,包括列的数量和名称以及行数。然后你应该释放结果sqlite3_free_table

于 2009-03-02T08:25:47.653 回答