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

結果を直接結合する代わりに、なぜこの方法を使用するのですか?

Androidquery()ではなくメソッドを使用したいのですが。rawQuery()

@zapiと@sixfeetsix、どうもありがとうございました、あなたの答えは私にこのアイデアを与えてくれます!

ここでテスト用のsqliteデータベースをダウンロードします http://db.tt/ZsEwE9TV

sqliteデータベースには、statuss、filtered_keywords、filtered_sourcesの3つのテーブルが含まれています。

各テーブルの列:

ステータス:

|_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_sources、long where句を作成する必要がありますが、これは非常に低速です。filtered_keywordsCursor

フィルタリングされた結果を取得する簡単な方法はありますか?

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

最初にテーブルをクエリし、LIKE両方を1セットのテキストに結合してから、そこからすべてのテキストを選択する必要があります。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           

更新

SELECTOPが、2つのfiltered_ *テーブルの1つが空の場合、以前のバージョンが機能しなかったことを指摘したため、ステートメントを更新しました。

于 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 に答える