Android sqlite过滤器查询结果包含其他两个表中的字符串

时间:2012-04-29 12:36:54

标签: sqlite

已更新

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

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||'%'
);

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

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

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

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

我有一个sqlite数据库包含三个表:status,filtered_keywords,filtered_sources。

每个表中的列:

状态:

|_id|text|source|

filtered_keywords和filtered_sources:

|_id|text|

现在,我想要过滤statuses的查询结果,其中包含filtered_keywordsfiltered_sources中的字词。

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

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

所以我必须首先将filtered_sourcesfiltered_keywords中的所有数据都查询为Cursor,然后构建一个long where子句,它真的很慢。

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

3 个答案:

答案 0 :(得分:1)

编辑:oops误解了你的意图。它不适合你。


我猜这有效:

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

首先应使用LIKE查询表格,将两者合并为一组文本,然后使用IN

从中选择所有文本

答案 1 :(得分: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指出当两个filtered_ *表中的一个为空时,以前的版本不起作用。

答案 2 :(得分:0)

您可以尝试使用联接进行查询:

SELECT * FROM statuses JOIN filtered_keywords ON statuses.text = filtered_keyword.text JOIN filtered_sources ON statuses.source = filtered_sources.text