2011-05-22 177 views
0

我想添加兩個單獨計數SQlite查詢的結果。假設我有一個名爲entriesscores 2個表和有2個疑問:添加兩個SQlite查詢的結果

SELECT COUNT(1) FROM entries WHERE 
    key NOT IN (SELECT key FROM scores) 

SELECT COUNT(1) FROM scores WHERE 
    value <= threshold 

也許我可以做這樣的事情讓他們的成績的總和:

SELECT COUNT(1) from (
    SELECT key FROM entries WHERE 
     key NOT IN (SELECT key FROM scores) 
    UNION ALL 
    SELECT key FROM scores WHERE 
     value <= threshold 
) 

但是,這有點太低效?這很經常調用,可能會干擾UI的平滑度。

謝謝。

[編輯]什麼實際上,我試圖做的:

我在做一個應用程序,以幫助學習詞彙。 entries表保留有關單詞類型,清晰度等的「靜態」數據。scores表保留有關您學習單詞的情況的信息(例如,表現,預定的下次審閱時間)

要檢查剩餘單詞學習/複習,我計算了scores表格中尚未存在(即從未觸摸過)或累積分數相當低(即需要複習)時不存在多少單詞。

我之所以不把這兩個表合併爲1(這會讓我的生活變得更容易),是因爲有時我需要通過插入新單詞,刪除一些單詞或更新其內容來更新entries表,我還沒有找到一個簡單的方法to do that。如果我只是做INSERT OR REPLACE,我會失去關於分數的信息。

+0

「COUNT(1)」你是指......?它只接受'*'或列標識符。 [見這裏](http://www.sqlite.org/lang_aggfunc.html)。 – 2011-05-22 09:32:55

+0

這是一個我在某處學到的計算行數的技巧:D – Phil 2011-05-22 09:35:34

+0

也許可以這樣說,在英文中,*最終意圖*是什麼:)要統計COUNT(*)應該被使用的行數。 – 2011-05-22 09:36:12

回答

2

我認爲你正在尋找一個UNION。工會結合了兩個查詢的結果。試試這個(抱歉,它沒有經過測試,我沒有訪問SQLite的):

SELECT COUNT(1) FROM 
(
    SELECT 1 
    FROM entries 
    WHERE key NOT IN (SELECT key FROM scores) 
    UNION ALL 
    SELECT 1 
    FROM scores 
    WHERE scores.value <= threshold 
) 

閱讀編輯你的問題解釋你需要做什麼,我覺得一個JOIN會更合適。這是將兩個表組合成一個查詢的一種方式。類似這樣的:

SELECT COUNT(1) 
FROM entries 
LEFT JOIN score 
    ON score.key = entries.key 
WHERE score.value <= threshold 
OR score.key is null 
+0

'UNION'將刪除重複的行。它必須是'UNION ALL'。請參閱[複合選擇語句](http://www.sqlite.org/lang_select.html)。 – 2011-05-22 09:32:10

+0

非常感謝加里! – Phil 2011-05-22 09:33:00

+0

@pst:我是新來的SQL。如果你發現任何錯誤,你能幫助我嗎?非常感謝:D – Phil 2011-05-22 09:34:18