我想获取所选行数以及所选数据。目前我要使用两条sql语句:
一个是
select * from XXX where XXX;
另一个是
select count(*) from XXX where XXX;
可以用单个sql字符串实现吗?
我查看了 sqlite3 的源代码,发现了sqlite3_changes()
. 但该功能仅在数据库更改时(之后insert, delete or update
)才有用。
谁能帮我解决这个问题?非常感谢!
试试这个方法
select (select count() from XXX) as count, *
from XXX;
SQL 不能混合单行(计数)和多行结果(从表中选择数据)。这是返回大量数据的常见问题。以下是一些如何处理此问题的提示:
读取前 N 行并告诉用户“有超过 N 行可用”。不是很精确,但通常足够好。如果您保持光标打开,您可以在用户点击视图底部时获取更多数据(谷歌阅读器这样做)
与其直接选择数据,不如先将其复制到临时表中。INSERT 语句将返回复制的行数。稍后,您可以使用临时表中的数据来显示数据。您可以在这个临时表中添加一个“行号”以使分页更简单。
在后台线程中获取数据。这允许用户在数据网格或表格填充更多数据时使用您的应用程序。
select (select COUNT(0)
from xxx t1
where t1.b <= t2.b
) as 'Row Number', b from xxx t2 ORDER BY b;
试试这个。
您可以将它们组合成一个语句:
select count(*), * from XXX where XXX
或者
select count(*) as MYCOUNT, * from XXX where XXX
一旦你已经有了select * from XXX
结果,你就可以在你的程序中找到数组长度,对吧?
对于那些仍在寻找另一种方法的人,我发现获得总行数的更优雅的方法是使用 CTE。这确保计数只计算一次:
WITH cnt(total) as (SELECT COUNT(*) from xxx) select * from xxx,cnt
唯一的缺点是如果需要 WHERE 子句,它应该在主查询和 CTE 查询中应用。
在第一条评论中,Alttag 说运行 2 个查询没有问题。我不同意这一点,除非两者都是独特交易的一部分。如果没有,源表可以通过来自另一个线程/进程的任何 INSERT 或 DELETE 在 2 个查询之间进行更改。在这种情况下,计数值可能是错误的。
要获取唯一标题的数量,您需要将 DISTINCT 子句传递给 COUNT 函数,如下所示:
SELECT
COUNT(DISTINCT column_name)
FROM
'table_name';
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
}
如果您使用sqlite3_get_table
而不是准备/步骤/完成,您将在一个数组(“结果表”)中一次获得所有结果,包括列的数量和名称以及行数。然后你应该释放结果sqlite3_free_table