获取带有条件的关联记录数

时间:2018-12-26 09:00:36

标签: sql postgresql count conditional-statements

我有两个表:

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个条件进行计数吗?

3 个答案:

答案 0 :(得分: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

答案 1 :(得分:1)

count(如果我没记错的话)应该仅对非null值起作用,因此在count()函数中指明列名即可直接使用

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

并且您不应该在其他情况下使用左连接列名作为内部连接..为此,您应该在相关的ON子句中移动条件

答案 2 :(得分:0)

这应该适用于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