SQL从多个表中获取数据

时间:2011-10-07 21:47:53

标签: mysql database

我有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

但是我只收到了一行消息,剩下的就不可见了。

知道我在这里做错了吗?

1 个答案:

答案 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_idmessages
  • 中是唯一的
  • user_idavatar
  • 中是唯一的

否则你需要指定你想要的值。

编辑:

我为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中,您必须选择所需的值,如果只有一个,您可以键入minmax

我将虚拟角色的加入更改为left join。可能并非所有用户都拥有头像。