繁体   English   中英

左边在1张桌子上加入2张桌子

[英]Left Join 2 tables on 1 table

它一定很简单,但我想不出任何解决方案,也无法在某处找到答案......

我得到了'用户'表
和一个表'博客'(user_id,blogpost)
和一个表'消息'(user_id,message)

我想得到以下结果:

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 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来测试它。

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

如果在select中使用聚合函数,SQL会将所有行折叠为单行。
要获得超过1行,您必须使用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 

计数将关闭,因为您正在计算重复的项目。

简单修复,但比选项1慢
如果您只计算不同的ID,您将获得正确的计数:

SELECT u.id, count(DISTNICT b.id), count(DISTINCT 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 

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM