2016-10-29 3 views
1

最初に私の問題に関する背景:
私はクローラを構築しており、いくつかの最高得点リストを監視したいと思います。
ハイスコアリストは、カテゴリとコレクション(一緒に一意)の2つのパラメータで定義されます。
新しい統計情報エントリ(カテゴリ、コレクション、createdAt、...)を作成します。結合キーのSqlite相対補完

問題:ハイスコアリストを1日に1回しか照会しません。ですから、24時間以内にダウンロードされていないカテゴリとコレクションを返すクエリが必要です。 これには統計表を使用する必要があります。
私はすべての可能なカテゴリとすべての可能なコレクションのリストを持っています。クロスジョインのように機能します。 基本的に私は、過去24時間のエントリとのクロスジョイントの相対的な補完が必要です

私の考え:クロス結合のカテゴリとコレクションは、作成中に作成されたすべてのペア(カテゴリ、コレクション)最後24時間

質問1:クエリ内でカテゴリとコレクションを定義してクロス結合することはできますか、それともそのためのテーブルを作成する必要がありますか?

質問2:私のアイデアは正しいアプローチですか?どのようにSqliteでこれを行いますか?

私は実際に欲しいもののイメージを描いたので、これは混乱するかもしれないことを理解します。

public List<Pair<String, String>> getCollectionsToDownload() throws SQLException { 
    long threshold = System.currentTimeMillis() - DAY; 
    QueryBuilder<TopAppStatistics, Long> query = queryBuilder(); 
    List<TopAppStatistics> collectionsNotToQuery = query.where().ge(TopAppStatistics.CREATED_AT, threshold).query(); 

    List<Pair<String, String>> toDownload = crossJoin(); 
    for (TopAppStatistics stat : collectionsNotToQuery) { 
    toDownload.remove(new Pair<>(stat.getCategory(), stat.getCollection())); 
    } 
    return toDownload; 
} 

private List<Pair<String, String>> crossJoin() { 
    String[] categories = PlayUrls.CATEGORIES; 
    String[] collections = PlayUrls.COLLECTIONS; 
    List<Pair<String, String>> toDownload = new ArrayList<>(); 
    for (String ca : categories) { 
    for (String co : collections) { 
     toDownload.add(new Pair<>(ca, co)); 
    } 
    } 
    return toDownload; 
} 

答えて

1

あなたの問題への最も簡単な解決策は、EXCEPTです: enter image description here

私はここC.

に興味を持っていますが、多分それは問題を理解するのに役立ちます、Javaで私の現在のコードです。 Aを計算するサブクエリ と、Bを計算するサブクエリがあるとします。これらのクエリ は非常に複雑です。キーは、両方とも同じ数の列と同等のデータ型を返さなければならないことです。

はSQLiteのではあなたがして行うことができます。そのよう

<your subquery 1> EXCEPT <your subquery 2> 

としてシンプル。例えば

SELECT a, b FROM T where a > 10 
EXCEPT 
SELECT a,b FROM T where b < 5; 

は覚えておいて、両方のサブクエリは、同じ列数を返す必要があります。