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