【问题标题】:SQLite on Android: Union with limits alternativeAndroid 上的 SQLite:具有限制替代的联合
【发布时间】:2011-03-21 06:49:11
【问题描述】:

我想创建一个Cursor,稍后我将通过CursorAdapter 传递给AutoCompleteTextView 以获得自动完成建议。问题是我的 SQL 语句需要从同一张表中选择 2 个不同的结果集,只是按不同的标准排序。同时,这些结果集不能重叠——否则我会有多个相同的建议。在 MySQL 上,这很容易:

(SELECT field3 FROM table ORDER BY field1 ASC LIMIT 5)
UNION
(SELECT field3 FROM table ORDER BY field2 DESC LIMIT 10)
LIMIT 10

在这种情况下,我将始终拥有最多 10 个唯一值。不幸的是,在 SQLite 上,情况并非如此 - 我不能对特定选择进行限制,只能对整个结果集进行限制,这使得 UNION 对这种情况根本没有用......

为了解决这个问题,我考虑过分别进行 2 个查询:从第一个查询迭代 Cursor 并将值放入 Array,然后从第二个查询迭代 Cursor 并将值放入相同的查询数组同时检查和跳过Array 中已有的值以避免重复。然后使用ArrayAdapter 将值传递给AutoCompleteTextView

理论上这是可行的——但我不喜欢的是一切都变得更加复杂,并且要编写更多代码来解决如此简单的任务......

有没有更好更简单的方法?

【问题讨论】:

    标签: android arrays sqlite cursor union


    【解决方案1】:

    以下将为您提供与 MySQL 示例相同的结果:

    CREATE TABLE IF NOT EXISTS unionTemp ( field3 TEXT)
    DELETE FROM unionTemp
    
    INSERT INTO unionTemp SELECT field3 FROM table ORDER BY field1 ASC LIMIT 5
    INSERT INTO unionTemp SELECT field3 FROM table ORDER BY field2 ASC LIMIT 10
    
    SELECT field3 FROM unionTemp GROUP BY field3 LIMIT 10
    

    您可能想要使用临时表。 (创建临时表...)

    【讨论】:

      【解决方案2】:

      您是否考虑过进行人工智能限制,从记录集的中间进行选择。让我用一个例子来说明这个想法

      首先您要从第一个查询中选择前 5 条记录。颠倒顺序,使其显示在记录集的末尾。此处没有限制。

      SELECT field3 FROM table ORDER BY field1 DESC
      

      例子:

      field1 | field2
      12       x
      11       x
      9        x 
      8        x
      7        x
      6        x
      5        x
      4        x
      3        x
      2        x
      1        x
      

      然后按照您想要的顺序执行第二个查询。此处没有限制。

      SELECT field3 FROM table ORDER BY field2 DESC
      

      然后对它们进行联合

      (SELECT field3 FROM table ORDER BY field1 DESC)
      UNION
      (SELECT field3 FROM table ORDER BY field2 DESC)
      

      你想要的结果在结果集的中间

      field1 | field2
      11       x
      10       x
      9        x 
      8        x
      7        x
      6        x
      ----------
      5        x
      4        x
      3        x
      2        x
      1        x
      x        1
      x        2
      x        3 
      x        4
      x        5
      x        6
      x        7
      x        8
      x        9
      x        10
      ----------
      x        11
      

      现在您可以对查询应用偏移量和限制。为了完成这项工作,您需要先查询表中符合查询条件的记录数。

      最终的查询类似于:

      (SELECT field3 FROM table ORDER BY field1 DESC)
      UNION
      (SELECT field3 FROM table ORDER BY field2 DESC)
      LIMIT 5+10 OFFSET N-5
      

      我明确写了LIMITS,以便能够自己计算,偏移N-5意味着从记录集的开头跳过N-5记录。

      【讨论】:

      • 好主意!但似乎 SQLite 也不允许在多选语句中使用ORDER BYSQL error: ORDER BY clause should come after UNION not before
      猜你喜欢
      • 2014-08-14
      • 2022-01-16
      • 2019-05-25
      • 2019-07-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-09-21
      相关资源
      最近更新 更多