sql - 在同一列上连接3个表

时间:2014-02-06 12:43:05

标签: mysql sql

表格是:

blogs
blog_id, user_id, blog_content

users
user_id, user_name

comments
comment_id, blog_id, user_id, comment_content

我想要做的是:获取:blog_content,创建博客的人的user_name,与特定博客关联的comment_content以及评论作者的user_name。我不知道如何获取最后一个,评论作者的user_name。到目前为止我有这个:

SELECT blogs.user_id, blogs.blog_id, blogs.blog_content, 
            users.user_id, users.name, 
            comments.comment_id, comments.blog_id, comments.user_id, comments.comment_content 
            FROM blogs 
            LEFT JOIN users ON users.user_id = blogs.user_id 
            LEFT JOIN comments ON comments.blog_id = blogs.blog_id 
            WHERE blogs.blog_id = 2

我如何在此查询中加入表格注释和用户,并同时获取博客创建者的user_name和评论作者?

3 个答案:

答案 0 :(得分:1)

您需要将评论表加入用户表的另一个副本:

SELECT b.user_id, b.blog_id, b.blog_content, 
       u.user_id, u.name, 
       c.comment_id, c.blog_id, c.user_id, c.comment_content ,
       uc.name as commentor_name
FROM blogs b LEFT JOIN
     users u
     ON u.user_id = b.user_id LEFT JOIN
     comments c
     ON c.blog_id = b.blog_id LEFT JOIN
     comments uc
     on c.user_id = uc.user_id
WHERE b.blog_id = 2;

在此查询中,所有表都具有表别名。这有助于使查询更具可读性。此外,需要表别名来区分对users的两个引用。一个参考是针对博客所有者,另一个是针对评论作者。

答案 1 :(得分:0)

SELECT blogs.user_id, blogs.blog_id, blogs.blog_content, 
            users.user_id, users.name, 
            comments.comment_id, comments.blog_id, comments.user_id, comments.comment_content 
            FROM blogs 
            LEFT JOIN users ON users.user_id = blogs.user_id 
            LEFT JOIN comments ON comments.blog_id = blogs.blog_id 
            LEFT JOIN comments c  ON c.user_id=users.user_id
            WHERE blogs.blog_id = 2

这次你可以再次加入评论表,给它一个别名,以区别于之前的评论表。

答案 2 :(得分:0)

您可以在同一个表上拥有多个联接。每个连接将从该表中检索另一组数据。为了在单个查询中多次包含同一个表,您必须为至少一个副本创建alias,以便SQL在尝试从列中检索数据时知道您指的是哪一个。 / p>

由于您需要为撰写评论的用户获取用户名,我建议您再次加入用户表,如下所示:

SELECT blogs.user_id,
       blogs.blog_id,
       blogs.blog_content, 
       users.user_id,
       users.name, 
       comments.comment_id,
       comments.blog_id,
       comments.user_id,
       comments.comment_content ,
       comment_writers.name as CommentUserName
FROM blogs 
LEFT JOIN users ON users.user_id = blogs.user_id 
LEFT JOIN comments ON comments.blog_id = blogs.blog_id
LEFT JOIN users AS comment_writers ON comment_writers.user_id = comments.user_id
WHERE blogs.blog_id = 2