SQLite查找子查询的查询特定索引

SQLite查找子查询的查询特定索引,sql,sqlite,Sql,Sqlite,所以我只知道足够危险的SQL,其他的就不多了。我正在开发一个应用程序,它需要显示来自SQLite数据库的数据部分,并且能够根据某些条件迭代某些数据 我有一张桌子,看起来像这样: create table packets( id INTEGER PRIMARY KEY, timestamp varchar(32), type varchar(32), source varchar(32), destination varchar(32), channel varchar(16), first_se

所以我只知道足够危险的SQL,其他的就不多了。我正在开发一个应用程序,它需要显示来自SQLite数据库的数据部分,并且能够根据某些条件迭代某些数据

我有一张桌子,看起来像这样:

create table packets( id INTEGER PRIMARY KEY, timestamp varchar(32), type varchar(32), source varchar(32), destination varchar(32), channel varchar(16), first_sequence integer, last_sequence integer, missing integer );
然后我有一个视图,它将根据某些条件显示部分或全部数据

我们谈论的是一个有数百万行的表,所以我无法将其全部加载到内存中。因此,我有一个视图类,它根据视图中的索引分别请求每个项目

例如,如果我正在显示通道值为“C”的所有数据包,并且视图准备好绘制第一项,我将向数据库发出此查询:

SELECT * FROM packets WHERE channel='C' LIMIT 1 OFFSET 0
当它准备好绘制第二个项目时,我会这样做

SELECT * FROM packets WHERE channel='C' LIMIT 1 OFFSET 1
等等

这个很好用。我意识到这可能不是做这件事的最佳方式,但我只是想先学习如何用SQLite做这件事的最简单方式,然后再考虑以后的优化

现在的问题是,我需要能够根据另一个搜索条件在这个结果集中查找项目,并在原始结果集中获取索引

例如,我需要能够遍历原始结果集中“缺少”值为1的项,并计算出这些项的视图索引

如果我使用表中的整个数据集,我想我可以使用类似的方法:

SELECT rowid FROM packets WHERE rowid > [currentlySelectedRowID] AND missing=1 LIMIT 1
但是当我需要数据子集中的索引时,rowid并不能真正帮助我,我不知道如何在子集中找到索引,而不需要自己逐个遍历所有项

如果您有任何关于如何使用SQL查询执行此操作的想法,或是相关文档或教程的指针,我们将不胜感激

谢谢

(注意:这个问题可能没有意义,因为如何解释这个问题在我的脑海中有点复杂,所以如果有什么不清楚的地方,我会尝试详细解释。)


编辑:实际上,我发现从性能角度来看,在C代码中这样做就足够了,通过执行LIMIT-1 OFFSET[startIndex]查询初始索引后的整个结果集,然后逐步执行,直到找到下一个缺少的项。不过,为了将来的参考,最好还是知道是否有一种方法可以只用SQL语句来实现这一点。

请注意,如果返回多行的SELECT语句没有ORDER BY子句,则返回行的顺序是未定义的

对于初始查询,顺序似乎并不重要,但在需要创建行的子集时,顺序将变得非常重要(因为您希望对子集的域使用相同的初始集)

使用

对结果施加命令。那你就可以了

SELECT rowid 
FROM (SELECT rowid,* FROM packets WHERE channel='C' ORDER BY rowid LIMIT N? OFFSET M?)
WHERE missing=1 LIMIT 1
在这些中找到一个子集

附录,re:从主SELECT语句返回的“rowid”是否反映了此临时表中的rowid

是的

sqlite> create table packets (channel, missing);
sqlite> insert into packets values ('A',0);
sqlite> insert into packets values ('B',0);
sqlite> insert into packets values ('C',0);
sqlite> select * from packets;
A|0
B|0
C|0
sqlite> create temp table tt as SELECT rowid,* FROM packets WHERE channel='C';
sqlite> select rowid,* from tt;
3|3|C|0
sqlite> insert into packets values ('C',1);
sqlite> drop table tt;
sqlite> create temp table tt as SELECT rowid,* FROM packets WHERE channel='C';
sqlite> select rowid,* from tt;
3|3|C|0
4|4|C|1
sqlite> 

感谢关于OrderBy的提示,我总是假设结果默认为rowid排序。我应该知道不要假设这样的事情。我相信我在某个地方读到,一个内部SELECT语句创建了一个临时表。如果是这种情况,那么从主SELECT语句返回的“rowid”是否反映了这个临时表中的rowid?@Gerald,是的,请参阅我的答案的附录。谢谢您提供的信息。但是,从这个角度看,rowid似乎反映了原始表的rowid,而不是临时表。我真正需要的是数据包子集的索引。i、 e.根据您的示例,如果我查询tt中的第一个“缺失”值1,我需要得到一个2而不是4的索引,以反映子集中的索引。抱歉,如果我不清楚这一点。一旦您有了记录的rowid,您就可以通过以下方式获得偏移量:select count(*)from(select rowid from packets WHERE channel='C'ORDER BY rowid LIMIT N?offset M?)WHERE rowid
sqlite> create table packets (channel, missing);
sqlite> insert into packets values ('A',0);
sqlite> insert into packets values ('B',0);
sqlite> insert into packets values ('C',0);
sqlite> select * from packets;
A|0
B|0
C|0
sqlite> create temp table tt as SELECT rowid,* FROM packets WHERE channel='C';
sqlite> select rowid,* from tt;
3|3|C|0
sqlite> insert into packets values ('C',1);
sqlite> drop table tt;
sqlite> create temp table tt as SELECT rowid,* FROM packets WHERE channel='C';
sqlite> select rowid,* from tt;
3|3|C|0
4|4|C|1
sqlite>