已更新
最后我用这种方式得到了过滤结果。
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_keywords
和filtered_sources
中的字词。
我知道我可以在sqlite中使用LIKE
,但我不能像IN
函数一样使用它。
SELECT * FROM statuses WHERE text in (SELECT text FROM filtered_sources);
所以我必须首先将filtered_sources
和filtered_keywords
中的所有数据都查询为Cursor
,然后构建一个long where子句,它真的很慢。
有没有简单的方法来获得过滤结果?
答案 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