MySQL加入count和where

时间:2016-06-21 17:15:45

标签: mysql sql database join

我想获取所有讨论并添加所有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;

1 个答案:

答案 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;

变化是:

  • second 表格中的字段上使用COUNT()。这将计算匹配数。 COUNT(*)永远不会返回0,在这种情况下(该组将被过滤掉)。
  • WHERE条件移至ON子句。否则,WHERE条件会过滤掉NULL值,将LEFT JOIN转换为内部联接。
  • 添加GROUP BY子句,以便每个讨论ID获得一行。

注意:假设它是DiscussionId上的主键,按Discussion分组就可以了。通常,最好在SELECT中的GROUP BY中包含所有未加聚合的列。但是当GROUP BY是主/唯一密钥时,它是可以的(并且符合ANSI SQL)。