我的表格如下所示:
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
得到结果。
即使没有匹配列,是否可以连接这些表以获得结果?
答案 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)
上的索引应提供非常好的性能。