COUNT()与INNER / LEFT JOIN结合使用不起作用

时间:2016-10-26 10:58:14

标签: mysql sql mysqli

我坚持使用mysql查询,这对我的糟糕程度来说似乎过于复杂。 任何帮助解决这个问题都将受到高度赞赏。

我有3张桌子:
_成员:所有成员的清单
_朋友:每个成员所有朋友的列表,使用2个字段:friends.id_member包含会员ID和friends.id_friend包含相应朋友的id。
 _ comments:成员发布的所有评论的列表(使用字段comments.id_member将此表连接到表成员)

我想:
_(1):显示成员可能拥有的所有朋友(在此示例中为成员编号35;它运作良好)

    SELECT friends.*, members.*
    FROM friends 
    INNER JOIN members ON friends.id_friend=members.id 
    WHERE friends.id_member='35'

_(2):使用相同的mysql查询,获取其发布的每个朋友的评论数量(并非所有朋友都发布了评论;这是我的问题)。 我试过这个:

    SELECT friends.*, members.*,
    COUNT(comments.id_member) AS nb_comments
    FROM friends 
    INNER JOIN members ON friends.id_friend=members.id 
    INNER JOIN comments ON comments.id_member=members.id 
    WHERE friends.id_member='35'

- >我只收到发表评论的朋友(没有发表评论的朋友,这应该在这里,被这个查询忽略),我得到的评论数量(nb_comments)是错误的。 另一个错误;如果成员根本没有朋友,则查询返回1行。

nb:a' LEFT JOIN评论评论.id_member = members.id'没有解决任何问题。

1 个答案:

答案 0 :(得分:1)

执行我认为你想要的一种方法是使用子查询:

SELECT f.*, m.*,
       (SELECT COUNT(*)
        FROM comments c
        WHERE c.id_member = m.id
       ) as nb_comments
FROM friends f INNER JOIN
     members m
     ON f.id_friend = m.id 
WHERE f.id_member = 35;

COUNT()添加到SELECT后,您可以将查询转换为聚合查询。如果没有GROUP BY,则返回一行。

注意:

  • 表别名的使用简化了查询,使其更易于编写和阅读。
  • 不应在数字常量周围使用单引号。我假设id_member被声明为数字。
  • 相关子查询会将计数添加到每一行。
  • 您应养成明确列出所需列的习惯。如果两个表具有相同名称的列,则可能会出现意外结果。