我有3个不同的表:
消息,评论和头像。
我想做的是以下内容: 获取数据库中的所有消息,计算每条消息的评论并显示每个用户的头像。
这是表格的构建方式:
消息 - > messages_id,user_id,title,message
评论 - > comments_id,messages_id,comment
头像 - > avatar_id,user_id,avatar
我尝试了以下内容:
SELECT *, COUNT(comments.comments_id) AS commentCount
FROM messages
LEFT JOIN comments ON messages.messages_id = comments.messages_id
LEFT JOIN avatar on messages.user_id = avatar.user_id
但是我只收到了一行消息,剩下的就不可见了。
知道我在这里做错了吗?
答案 0 :(得分:1)
您需要使用GROUP BY
:
SELECT messages_id
, title
, message
, user_id
, avatar_id
, avatar
, count(*) as commentCount
FROM messages
inner join avatar on messages.user_id = avatar.user_id
left join comments on messages.messages_id = comments.messages_id
GROUP BY messages_id
这应该适用于:
messages_id
在messages
user_id
在avatar
否则你需要指定你想要的值。
编辑:
我为inner join
表思考写了avatar
,因为所有用户都有一个头像。如果不是这样,则应该在查询中left join
。
第二次尝试
可能错误是group by
应该是messages.messages_id
而不是messages_id
。实际上在其他RDMBS中这是一个错误:
错误:列引用“messages_id”不明确
我会更精确:
SELECT m.messages_id as id
, min(m.title) as title
, min(m.message) as message
, min(m.user_id) as user_id
, min(a.avatar_id) as avatar_id
, min(a.avatar) as avatar
, count(c.comments_id) as commentCount
FROM messages as m
left join avatar as a on m.user_id = a.user_id
left join comments as c on m.messages_id = c.messages_id
GROUP BY m.messages_id
如果您确定只有一个值,则可以在MySQL中删除所有min
。在标准SQL中,您必须选择所需的值,如果只有一个,您可以键入min
或max
。
我将虚拟角色的加入更改为left join
。可能并非所有用户都拥有头像。