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