mysql - SQL从多个表中获取数据

标签 mysql database

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

否则您需要指定您想要获取的值。

编辑:

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

我将与头像的连接更改为左连接。可能并非所有用户都有头像。

关于mysql - SQL从多个表中获取数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7693181/

相关文章:

mysql - 为什么mysql会抛出语法错误

mysql - 如何在 Windows 上的 Neo4j 中导入 MySQL 数据库?

database - 使用 liquibase 将 postgres 表复制到另一个模式

php - 连接两个表并遍历数据

mysql - 创建DATABASE时的SQL_MODE和TIME_ZONE

sql - 使用嵌套 IFNULL 沿着互斥路径检查表?

python - Python向数据库添加字符串后字母错误

PHP 内部联接使用 PDO 验证多个用户(如果已存在)

php - laravel 发送文件时出现 HTTP ERROR 500

java - 针对更多类型的数据库运行 JUnit 测试