【问题标题】:How to join SQL tables while selecting a COUNT() function?如何在选择 COUNT() 函数时加入 SQL 表?
【发布时间】:2009-12-27 15:06:11
【问题描述】:

我有两个数据库表,“Lists”和“Notes”。
列表有列 _id、listname
Notes 有列 _id、checked、list_id(它是 Lists._id 的外键)以及更多与此问题无关的列。

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

查询应该返回列表中的所有条目。

我可以使用以下查询分别获取计数和 _ids & listnames

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 可获得奖励积分。

【问题讨论】:

    标签: sql join sqlite


    【解决方案1】:

    编辑:添加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
    

    【讨论】:

    • 我从来没有想过我可以使用 SUM 来获取选中的列!好想法。 GROUP BY 是我缺少的部分。谢谢
    • 解决方案遇到了一个问题。如果 "notes" 中没有匹配项,则 SUM(checked) 返回 null。我需要它默认返回 0。
    • @CSharperWithJava:你说得对,我添加了一个IFNULL 来避免这个问题。
    【解决方案2】:
    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 
    

    【讨论】:

    • 这看起来像是我想出的,但我正在寻找更优雅的东西。
    猜你喜欢
    • 2011-07-06
    • 2012-06-17
    • 2021-09-11
    • 2015-10-12
    • 1970-01-01
    • 2021-11-24
    • 2021-12-15
    • 2013-10-29
    • 1970-01-01
    相关资源
    最近更新 更多