2010-07-26 74 views
2

我想创建一个Cursor,稍后我会通过CursorAdapterAutoCompleteTextView获取自动完成建议。问题是我的SQL语句需要从同一个表中选择2个不同的结果集,只是按不同的标准排序。同时这些结果集不能重叠 - 否则我会有多个相同的建议。在MySQL上,这将是很容易的:Android上的SQLite:带限制的替代

(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

理论上这会工作 - 但我不喜欢,一切都变得更复杂,更写代码来解决这样一个简单的任务...

也许有更好的和更容易的方式来做到它?

回答

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记录。

+1

好主意!但是,似乎SQLite也不允许在多选语句中使用'ORDER BY':'SQL错误:ORDER BY子句应该在UNION之前出现' – Laimoncijus 2010-07-26 21:50:07

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 

您可能需要使用临时表。 (CREATE TEMP TABLE ...)