代码之家  ›  专栏  ›  技术社区  ›  Laimoncijus

Android上的sqlite:union with limits可选

  •  2
  • Laimoncijus  · 技术社区  · 14 年前

    我想创建一个 Cursor ,稍后我将通过 CursorAdapter AutoCompleteTextView 用于自动完成建议。问题是,我的SQL语句需要从同一个表中选择两个不同的结果集,只是按不同的条件排序。同时,这些结果集不能重叠-否则我会有多个相同的建议。在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上,情况并非如此——我不能对特定的选择进行限制,只能对整个结果集进行限制,这使得then union对本例根本没有用处……

    为了解决这个问题,我考虑单独进行两个查询:遍历 光标 从第一个查询并将值放入 Array ,然后迭代 光标 从第二个查询,同时将值放入同一数组,同时检查和跳过 数组 避免重复。然后使用 ArrayAdapter 将值传递给 自动补全文本框 .

    理论上这是可行的——但我不喜欢所有事情都变得更加复杂,为了解决这样一个简单的任务,需要编写更多的代码……

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

    2 回复  |  直到 14 年前
        1
  •  2
  •   Pentium10    14 年前

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

    首先,您要从第一个查询中选择前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 从记录集开始的记录。

        2
  •  1
  •   OferR    14 年前

    下面将给出与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
    

    您可能需要使用临时表。(创建临时表…)