0

更新

最后我用这种方式得到过滤结果。

SELECT * FROM statuses WHERE _id NOT IN (
    SELECT DISTINCT statuses._id FROM statuses, filtered_sources WHERE statuses.source LIKE '%'||filtered_sources.text||'%'
    UNION
    SELECT DISTINCT statuses._id FROM statuses WHERE statuses.screen_name IN(SELECT filtered_users.text FROM filtered_users)
    UNION
    SELECT DISTINCT statuses._id FROM statuses, filtered_keywords WHERE statuses.text LIKE '%'||filtered_keywords.text||'%'
);

为什么我使用这种方式而不是直接组合结果?

我想使用query()方法而不是rawQuery()在 Android 中。

@zapi 和 @sixfeetsix ,非常感谢,你的回答给了我这个想法!

在此处下载 sqlite 数据库进行测试 http://db.tt/ZsEwE9TV

我有一个 sqlite 数据库,其中包含三个表:statuses、filtered_keywords、filtered_sources。

每个表中的列:

状态:

|_id|text|source|

过滤关键字和过滤来源:

|_id|text|

现在我想过滤查询结果中statuses包含的单词filtered_keywordsfiltered_sources

我知道我可以LIKE在 sqlite 中使用,但我不能像IN函数一样使用它。

SELECT * FROM statuses WHERE text in (SELECT text FROM filtered_sources);

所以我必须先查询filtered_sourcesandfiltered_keywords中的所有数据Cursor,然后构建一个很长的where子句,这真的很慢。

有没有简单的方法来获得过滤结果?

4

3 回答 3

1

编辑:哎呀误解了你的意图。它对你不起作用。


我想这行得通:

SELECT * FROM statuses WHERE text in (
    SELECT text FROM filtered_sources WHERE text LIKE '%?%'
    UNION
    SELECT text FROM filtered_keywords WHERE text LIKE '%?%'
);

应该首先使用 a 查询表LIKE,将两者组合成一组文本,然后从那里选择所有文本IN

于 2012-04-29T12:47:49.890 回答
1

你可以这样做:

SELECT statuses.* 
FROM statuses, filtered_sources
WHERE statuses.text LIKE '%' || filtered_sources.text || '%'
UNION
SELECT statuses.*
FROM statuses, filtered_keywords
WHERE statuses.text LIKE '%' || filtered_keywords.text || '%';';

例如:

create table statuses (_id, text, source);
create table filtered_keywords (_id, text);
create table filtered_sources (_id, text);

insert into statuses values (1, 'foobar', NULL);
insert into statuses values (2, 'foofoobar', NULL);                              
insert into statuses values (3, 'foofoobarbar', NULL);

insert into filtered_keywords values (1, 'foofoo');
insert into filtered_sources values (1, 'barbar');

.headers on
.mode column
.width 3 15 6 

SELECT statuses.* 
FROM statuses, filtered_sources
WHERE statuses.text LIKE '%' || filtered_sources.text || '%'
UNION
SELECT statuses.*
FROM statuses, filtered_keywords
WHERE statuses.text LIKE '%' || filtered_keywords.text || '%';';

输出:

_id  text             source
---  ---------------  ------
2    foofoobar              
3    foofoobarbar           

更新

我更新了SELECT语句,因为 OP 指出当两个 filters_* 表之一为空时,以前的版本不起作用。

于 2012-04-29T13:12:34.073 回答
0

您可以尝试使用连接查询:

SELECT * FROM statuses JOIN filtered_keywords ON statuses.text = filtered_keyword.text JOIN filtered_sources ON statuses.source = filtered_sources.text
于 2012-04-29T14:20:00.610 回答