mysql三连接查询

时间:2016-11-25 15:55:55

标签: mysql sql join

我的表格如下所示:

    users table
user_id user_email user_name
   1      a@a.com     a
   2      b@b.com     b
   3      c@c.com     c

    bookmarks table
bookmark_id  user_id      bookmark_url
    1           1        http://aaa.com
    2           3        http://bbb.com
    3           3        http://ccc.com
    4           3        http://ddd.com

    comments table
comment_id   user_id       content
    1           2          'hello'
    2           2          'hello2'

我想要的是这样的:

user_id  user_email  user_name bookmarksCount commentsCount
   1       a@a.com       a           1              0
   2       b@b.com       b           0              2
   3       c@c.com       c           3              0

从上面看,每个xxx_id都是自动递增的序列ID。

我认为要获得上述结果,我必须加入这3个表。但是,如果书签和评论表中没有匹配user_id,则无法加入。但如果没有匹配,我必须使用0得到结果。

即使没有匹配列,是否可以连接这些表以获得结果?

1 个答案:

答案 0 :(得分:3)

您可以使用相关子查询:

select u.*,
       (select count(*) from bookmarks bm where bm.user_id = u.user_id
       ) as cnt_bookmarks,
       (select count(*) from comments c where c.user_id = u.user_id
       ) as cnt_comments
from users u;

如果您尝试使用join执行此操作,则会遇到问题,因为您将为每个用户生成书签和评论的笛卡尔积。此外,在连接之后进行聚合可能会导致性能问题,因为聚合的数据将大于必要的数据。

对于此查询,bookmarks(user_id)comments(user_id)上的索引应提供非常好的性能。