[英]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.