2016-06-21 52 views
0

我想要提取所有讨论并添加所有UserDiscussion行的列数,其中'bookmarked'列在讨论中为真。MySQL加入count并且其中

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

写正确的方法是:

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)。

+0

...和您的服务器的规则允许它。 – Strawberry