我想获取所有讨论并添加所有UserDiscussion行的计数,其中'bookmarked'列为true。
Table: Discussion
-----------------
DiscussionID
Name
.....
Table: UserDiscussion
---------------------
UserID
DiscussionID
Bookmarked (Boolean)
这是我的查询,但不正确:
SELECT d.*, COUNT(*) as BookmarkCount
FROM Discussion d
LEFT JOIN UserDiscussion ud
ON ud.DiscussionID = d.DiscussionID
WHERE ud.Bookmarked = true;
答案 0 :(得分:1)
写这个的正确方法是:
SELECT d.*, COUNT(ud.DiscussionID) as BookmarkCount
FROM Discussion d LEFT JOIN
UserDiscussion ud
ON ud.DiscussionID = d.DiscussionID AND
ud.Bookmarked = true
GROUP BY d.DiscussionId;
变化是:
COUNT()
。这将计算匹配数。 COUNT(*)
永远不会返回0
,在这种情况下(该组将被过滤掉)。WHERE
条件移至ON
子句。否则,WHERE
条件会过滤掉NULL
值,将LEFT JOIN
转换为内部联接。GROUP BY
子句,以便每个讨论ID获得一行。注意:假设它是DiscussionId
上的主键,按Discussion
分组就可以了。通常,最好在SELECT
中的GROUP BY
中包含所有未加聚合的列。但是当GROUP BY
是主/唯一密钥时,它是可以的(并且符合ANSI SQL)。