一定很容易,但我想不出任何解决办法,也无法在某处找到答案......
我得到了'用户'的表格
和一个表'博客'(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
它显然不起作用,因为第二个左连接与博客而不是用户有关。有什么建议吗?
答案 0 :(得分:3)
首先,如果您只想要计数值,则可以进行子选择:
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
来包含没有博客但有消息的用户。这意味着您会多次获得多个用户,因此分组会有所帮助。
答案 1 :(得分:1)
如果在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