Mysql 左键连接1个表上的2个表

Mysql 左键连接1个表上的2个表,mysql,left-join,multiple-tables,Mysql,Left Join,Multiple Tables,这一定很容易,但我想不出任何解决办法,也找不到答案 我得到了表“用户” 和一个表“blogs”(用户id,blogpost) 和一个表“消息”(用户id,消息) 我想得到以下结果: User | count(blogs) | count(messages) Jim | 0 | 3 Tom | 2 | 3 Tim | 0 | 1 Foo | 2 | 0 所以我所做的是: SELECT u.id, count(b.id), count(m.id) FROM `users` u

这一定很容易,但我想不出任何解决办法,也找不到答案

我得到了表“用户”
和一个表“blogs”(用户id,blogpost)
和一个表“消息”(用户id,消息)

我想得到以下结果:

User | count(blogs) | count(messages)  
Jim | 0 | 3  
Tom | 2 | 3  
Tim | 0 | 1  
Foo | 2 | 0
所以我所做的是:

SELECT u.id, count(b.id), count(m.id) FROM `users` u  
LEFT JOIN blogs b ON b.user_id = u.id  
LEFT JOIN messages m ON m.user_id = u.id  
GROUP BY u.id

这显然不起作用,因为第二个左连接与博客相关,而不是与用户相关。有什么建议吗?

如果在select中使用聚合函数,SQL会将所有行折叠成一行。
为了得到多于一行,必须使用
group by
子句。
然后SQL将生成每个用户的总数

最快选项

SELECT 
  u.id
  , (SELECT(COUNT(*) FROM blogs b WHERE b.user_id = u.id) as blogcount
  , (SELECT(COUNT(*) FROM messages m WHERE m.user_id = u.id) as messagecount
FROM users u   
为什么代码不起作用

SELECT u.id, count(b.id), count(m.id) 
FROM users u   
LEFT JOIN blogs b ON b.user_id = u.id       <<-- 3 matches multiplies # of rows *3
LEFT JOIN messages m ON m.user_id = u.id    <<-- 5 matches multiplies # of rows *5
GROUP BY u.id 

首先,如果只需要计数值,可以执行子选择:

select u.id, u.name, 
    (select count(b.id) from blogs where userid = u.id) as 'blogs',
    (select count(m.id) from messages where userid = u.id) as 'messages'
from 'users'
请注意,这只是一个简单的sql示例,我现在没有mysql db来测试它


另一方面,您可以进行连接,但应该使用
外部连接
来包括没有博客但有消息的用户。这意味着您会多次获得多个用户,因此分组方式会很有帮助。

我已经获得了
分组方式,只是忘了把它也写下来。但是结果仍然是错误的,看起来像:
User | count(blogs)| count(messages)Jim | 0 | 0 Tom | 2 | Tim | 0 | 0 Foo | 2
@user993692-这取决于子查询。现代数据库足够智能,可以优化子选择,在这种情况下,您只需要一个键搜索,这是非常轻量级的(假设您没有千万用户)。
select u.id, u.name, 
    (select count(b.id) from blogs where userid = u.id) as 'blogs',
    (select count(m.id) from messages where userid = u.id) as 'messages'
from 'users'