我想获取所有讨论并添加所有UserDiscussion行的计数,其中“已标记”列对于该讨论是正确的。

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;

最佳答案

编写此代码的正确方法是:

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上的主键。通常,最好在SELECTGROUP BY中包括所有未聚合的列。但是当GROUP BY通过主键/唯一键使用时,可以(并符合ANSI SQL)。

08-26 08:52