【问题标题】:Get count of associated records with conditions获取具有条件的关联记录数
【发布时间】:2019-05-24 13:54:42
【问题描述】:

我有两张桌子:

users 只有两列:id: INT, name: TEXT

houses 包含三列:id: INT, user_id: INT, sold_at: DATE

我有一个查询用户售出的房屋数量:

SELECT users.id, COUNT(CASE WHEN houses.sold_at IS NOT NULL THEN 1 END)
FROM users
LEFT JOIN houses on houses.user_id = users.id
GROUP BY users.id

这行得通,但我想知道是否有办法在计数中没有条件。我试过这个:

SELECT users.id, COUNT(houses.id)
FROM users
LEFT JOIN houses on houses.user_id = users.id
WHERE houses.sold_at IS NOT NULL
GROUP BY users.id

但这不起作用,因为如果用户没有任何关联的房子,它就不会出现在结果集中。

我唯一的选择是对 COUNT 做条件吗?

【问题讨论】:

    标签: sql postgresql count conditional-statements


    【解决方案1】:

    您可以尝试将 where 子句的条件放在 ON 子句中,如下所示-

    SELECT users.id, COUNT(houses.id)
        FROM users
        LEFT JOIN houses on houses.user_id = users.id
        and houses.sold_at IS NOT NULL
        GROUP BY users.id
    

    【讨论】:

      【解决方案2】:

      这应该适用于RIGHT JOIN

       SELECT users.id, COUNT(houses.id)
          FROM users
          RIGHT JOIN houses on houses.user_id = users.id
          WHERE houses.sold_at IS NOT NULL
          GROUP BY users.id
      

      【讨论】:

        【解决方案3】:

        count(如果我没记错的话)应该只对非空值起作用,因此在 count() 函数中指示列名,您可以直接使用

        SELECT users.id, COUNT( houses.sold_at )
        FROM users LEFT JOIN houses on houses.user_id = users.id
        GROUP BY users.id
        

        你不应该在其他地方使用左连接列名,因为这是一个内部连接..为此你应该在相关的 ON 子句中移动条件

        【讨论】:

        • 你没记错。 count(<expression>) 只计算 <expression> 计算结果为非空值的实例,除非 <expression>*,然后只计算所有行。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-02-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多