2011-05-22 144 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