【问题标题】:Select every nth term including first from sqlite database从 sqlite 数据库中选择每第 n 个术语,包括第一个术语
【发布时间】:2014-03-11 21:41:44
【问题描述】:

我正在尝试选择第一行和之后的每五行(这给了我 4 个具有唯一行的查询),但我不确定它是否正确,因为我的结果与预期不符。

    //create the nth row selection
    int n = level + 5;

    //query the content resolver
    Cursor cursor = contentResolver.query(
            MainContentProvider.CONTENT_URI_ENGLISH,
            DatabaseOpenHelper.PROJECTION_ENGLISH,
            DatabaseOpenHelper.KEY_ROW_ID + " = " + (level+1) + " OR " + DatabaseOpenHelper.KEY_ROW_ID +" % " + n +" = 0",
            null,
            DatabaseOpenHelper.KEY_ROW_ID + " ASC"
    );

其中level[0,3] 区间内。 结果加起来没有达到预期值,而且少了一倍(大约)。


我的查询方法应该如何从第一行开始每隔五行选择一次?

【问题讨论】:

    标签: android sql database sqlite android-contentresolver


    【解决方案1】:

    您可以使用以下查询来实现这一点(虽然我不确定它的性能):

    SELECT 
      id,
      name,
      (SELECT count(*) - 1 FROM my_table t_inner WHERE t.id >= t_inner.id) AS ordinal 
    FROM my_table t
    WHERE ordinal % 5 == 0
    ORDER BY id ASC;
    

    或者您可以创建CursorWrapper,它将返回行的子集。这种方法的缺点是您必须从数据库中获取每一行,如果您有大量数据,这可能会很慢。

    【讨论】:

      【解决方案2】:

      (假设行 ID 是连续的,)rowid % X = 0 选择每个Xth 行,因此您不能更改X

      如果您无法更改该术语,则必须更改另一个术语。 对 rowid 值 ((rowid - offset) % X = 0) 应用偏移量,或与另一个值 (rowid % X = offset) 进行比较,其中 offset0X-1 的范围内。

      请注意,第一次比较 (rowid = level+1) 不是必需的。

      【讨论】:

        猜你喜欢
        • 2015-12-03
        • 1970-01-01
        • 2018-04-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多