Android sqlite筛选器查询结果在其他两个表中包含字符串

Android sqlite筛选器查询结果在其他两个表中包含字符串,sqlite,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 st

更新

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

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数据库进行测试

我有一个sqlite数据库,它包含三个表:状态、过滤的\u关键字、过滤的\u源

每个表中的列:

状态:

|_id|text|source|
过滤的\u关键字和过滤的\u来源:

|_id|text|
现在,我想从状态中筛选查询结果,这些状态包含筛选的\u关键字和筛选的\u源中的单词

我知道我可以在sqlite中使用LIKE,但我不能在函数中使用LIKE

从状态中选择*,其中文本在从过滤的\u源中选择文本; 因此,我必须首先查询筛选的\u源中的所有数据和筛选的\u关键字作为游标,然后构建一个长where子句,这非常慢


有什么简单的方法可以得到过滤结果吗?

编辑: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查询表格,将两者合并成一组文本,然后从中选择所有文本。在

中,您可以执行以下操作:

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指出,当两个筛选的_*表中的一个为空时,以前的版本不起作用。

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

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

你能提供一些带有文本的示例表以及过滤应该如何工作吗?我在我的数据库中进行了尝试,但发现了一个问题。如果其中一个表有0行,我将得到空结果。你有办法解决这个问题吗?