如何计算sqlite中某行之前的行数?

时间:2010-07-07 10:17:23

标签: android sqlite

我有一个存储项目等级的数据库。 如果考虑所有项目,则排名是绝对值。

如果我只需要一个子集说这四个项目,它会给我一些类似的东西:

Rank     RowId in the whole Table
---------------
4         114 
8         71
70        16
83        7

我现在需要一个int,仅在子集中指定排名,其中max rank是我的示例1,2,3,4中子集中的项目数。

有没有办法在我的sqlite查询中实现这一点?我只需要我的活动中的一个等级。我想到按排名排序查询的结果,然后以某种方式得到我想在那一刻排名的项目的位置。但是我如何用sqlite实现这个目标呢?

我尝试创建一个临时表并将子集插入其中,如下所示:

CREATE TABLE rank(ID); INSERT INTO位置SELECT ID来自项目WHERE ITEM_ID = 3 ORDER BY POSITION; 从等级WHERE ID = 9中选择RowID; DROP TABLE排名;

这在SQLite Manager中有效,并返回正确的数字。但是,如果我在Android中执行此操作,则在编译查询时无法表示没有表级别

07-07 13:35:46.150: ERROR/AndroidRuntime(2047): Caused by: android.database.sqlite.SQLiteException: no such table: rank: , while compiling: SELECT RowID from rank WHERE ID = 9

3 个答案:

答案 0 :(得分:1)

编辑:必须同意@Matt,我能够做到这一点的唯一方法是使用临时表方法。

这里的价值看起来是什么......

create temp table if not exists <temptable>(Id integer primary key, rank); 
insert into temptable(rank) select <column> from <table>; 
select * from temptable; 

编辑:实际上,它返回与行不相关的ID,因此你不会总是得到1,2,3,4 ......我还要考虑别的东西。遗憾。

不确定我是否理解你的问题。你基本上想要这个吗?

Id        Value
---------------
1         4
2         8 
3         70
4         83

因此,无论您的子集包含什么,您都希望添加伪列作为ID?

如果这是正确的话那应该这样做......

SELECT RowId, <other columns>.... FROM <table> WHERE <where>

如果我误解了道歉。

答案 1 :(得分:1)

您可以将查询(按排名排序)输出到具有自动增量ID的临时表中。

答案 2 :(得分:-1)

如果您只需要从子查询中读取一行,则可以始终对其执行限制,方法是提供首先要跳过的记录数的偏移量以及返回的数量

所以,如果你想获得第25行,你告诉我跳过24,然后返回1

select * from (SELECT * FROM table order by rank) limit 24,1