2009-12-27 110 views
2

我有两个数据库表,“列表”和“注意事项”。
列表中的列_id,LISTNAME
Notes有列_id,检查,LIST_ID(这是Lists._id的外键),多列不相关的这个问题。如何在选择COUNT()函数的同时连接SQL表?

我想创建一个返回四列的查询:
Lists._id,Lists.listname,此列表中所有选中Notes的计数,此列表中所有Notes的计数。

查询应来自列表返回所有条目。

我能得到的计数和_ids & listnames seperately,使用下面的查询

SELECT _id, listname FROM Lists 
SELECT count(checked) FROM Notes WHERE checked='1' and list_id=foo_id 
SELECT count(*) FROM Notes WHERE list_id=foo_id 

在这些语句,foo_id指列表_id我想计数检查和总物品。

有人能告诉我我怎么可能把这些都变成一个查询?

积分为抛出AS在那里的数列。

回答

8

编辑:新增IFNULL返回0当外部联接返回任何行count_checked;添加别名。

SELECT 
    l._id, 
    l.listname, 
    IFNULL(SUM(n.checked), 0) AS count_checked, 
    COUNT(*) AS count_total 
FROM lists l 
LEFT OUTER JOIN notes n ON (l._id = n.list_id) 
GROUP BY l._id, l.listname 
+0

我从来没有这样做过,我可以使用SUM来获取选中的列!好想法。 GROUP BY是我错过的部分。谢谢 – CodeFusionMobile 2009-12-27 15:17:31

+0

解决了一个问题。如果“笔记”中没有匹配,则SUM(checked)返回null。我需要它默认返回0。 – CodeFusionMobile 2010-01-02 16:26:52

+0

@CSharperWithJava:你说得对,我添加了一个'IFNULL'来避免这个问题。 – 2010-01-02 18:38:27

1
SELECT _id, listname, 
    (SELECT count(checked) FROM Notes WHERE checked='1' and Notes.list_id=Lists.list_id) AS count_checked, 
    (SELECT count(*) FROM Notes WHERE Notes.list_id=Lists.list_id) as count_all 
    FROM Lists 
+0

看起来像什么,我会拿出,但是我一直在寻找的东西多一点优雅。 – CodeFusionMobile 2009-12-27 15:13:57