我有 3 个不同的表:
消息、评论和头像。
我想做的是: 获取数据库中的所有消息,统计每条消息的评论并显示每个用户的头像。
这就是表格的构建方式:
消息 -> messages_id、user_id、标题、消息
评论 -> comments_id、messages_id、评论
头像 -> avatar_id、user_id、头像
我尝试了以下方法:
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
但我只收到一行消息,其余部分不可见。
知道我在这里做错了什么吗?
最佳答案
您需要使用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
中是唯一的
否则您需要指定您想要获取的值。
编辑:
我为avatar
表思维编写了inner join
,因为所有用户都有一个头像。如果这不是真的,应该像您的查询中那样left join
。
第二次尝试
也许错误是group by
应该是messages.messages_id
而不是messages_id
。事实上,在其他 RDMBS 中这是一个错误:
ERROR: column reference "messages_id" is ambiguous
我会更精确:
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
。
我将与头像的连接更改为左连接
。可能并非所有用户都有头像。
关于mysql - SQL从多个表中获取数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7693181/