代码之家  ›  专栏  ›  技术社区  ›  Janusz Daniel Rindt

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

  •  1
  • Janusz Daniel Rindt  · 技术社区  · 15 年前

    我有一个数据库来存储一个项目的等级。 等级是一个绝对值,如果考虑到所有的项目,它将是正确的。

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

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

    我现在需要一个int,它只在最大秩是我的示例1、2、3、4中子集中的项数的子集中指定秩。

    在我的sqlite查询中有实现这一点的方法吗?在我的活动中我只需要一个等级。我想把查询的结果按等级排序,然后不知怎么地得到了我想在那一刻排序的项目的位置。但是我如何用sqlite实现这一点呢?

    我试图创建一个临时表,并像这样将子集插入其中:

    创建表等级(ID); 插入位置从项目中选择ID,其中项目ID=3按位置排序; 从列组中选择rowid,其中id=9; 删除表等级;

    这在SQLite管理器中工作,将返回正确的数字。但是如果我在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 回复  |  直到 15 年前
        1
  •  1
  •   Andy Robinson    15 年前

    编辑:必须同意@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>
    

    如果我误解了,请道歉。

        2
  •  1
  •   Matt Ellen Bipin Vayalu    15 年前

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

        3
  •  -1
  •   Pentium10    15 年前

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

    所以如果你想坐第25排,你告诉跳过24,然后返回1

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