如何加入3个表,主题,评论和用户

时间:2013-04-02 06:35:01

标签: mysql sql select

我有3个表,tbl_topic,tbl_comment,tbl_user。 我想选择用户创建的所有主题以及他评论的主题,即使他不是创建者。这是我的数据库:

tbl_topic
----------
topic_id
topic_title
user_id

tbl_comment
----------
comment_id
comment_message
user_id
topic_id

tbl_user
----------
user_id
user_name

非常需要它。谢谢!

到目前为止我得到了这个

select * from tbl_topic T inner join tbl_comment C on T.topic_id = C.topic_id inner join tbl_user U on T.user_id = U.user_id GROUP BY T.topic_id

我的问题是它只返回对其有评论的主题。我希望包含用户创建的主题,即使它有0条评论。

我希望结果如下:

  +-----------+-----------+----------+-------------+----------------+----------+-------
    | topic_id | topic_title | user_id | comment_id | comment_message | user_id | topic_id | 
    +-----------+-----------+----------+-------------+----------------+----------+--------
    | 1         | my topic  |   1      | 1          | comment me      | 1       |  1
    | 2         | others    |   2      | 2          | comment me      | 1       |  2
    | 3         | my nocoment|  1      | NULL       | NULL            | NULL    | NULL
    +-----------+---------+--------+-------------+----------+----------+---------+--------

     ----------+-----------+
         user_id | user_name |
        -----------+-----------
         1         | me       |
         2         | someone  |
         1         | me
        -----------+---------+--

我搞砸了我的表中的字段,comment_message旁边的user_id应该是comment_user_id,但我已经以这种方式创建了我的数据库。你能帮忙做到这一点吗?

3 个答案:

答案 0 :(得分:2)

下面的查询在子查询中使用UNION first SELECT获取用户创建的所有主题。 第二个 SELECT语句获取用户的所有注释并将其连接到表tbl_topic,以便我们获取topic_title

SELECT  topic_ID, topic_title
FROM
        (
            SELECT  a.user_ID, b.topic_ID, b.topic_title
            FROM    tbl_user a
                    INNER JOIN tbl_topic b
                        ON a.user_ID = b.user_ID
            UNION
            SELECT  a.user_ID, c.topic_ID, c.topic_title
            FROM    tbl_user a
                    INNER JOIN tbl_comment b
                        ON a.user_ID = b.user_ID
                    INNER JOIN tbl_topic c
                        ON b.topic_ID = c.topic_ID
        ) x
WHERE   x.user_ID = ?

答案 1 :(得分:0)

尝试以下查询。这将显示所有字段。

SELECT tt.*, tc.*, tbl_user.*
FROM tbl_topic AS tt INNER JOIN tbl_comment AS tc ON tt.topic_id = tc.topic_id INNER JOIN tbl_user as tc ON tc.user_id = tu.user_id;
WHERE tu.user_id = x

如果必须过滤添加到查询的WHERE子句。

答案 2 :(得分:0)

使用左连接。但是还有一个问题,你只能获得一个表评论和一个用户。要获得更多信息,您可以使用GROUP_CONCAT函数,例如:http://dev.mysql.com/doc/refman/5.0/en/group-by-functions.html#function_group-concat

select * from tbl_topic T 
    LEFT JOIN tbl_comment C on T.topic_id = C.topic_id 
    LEFT join tbl_user U on T.user_id = U.user_id 
WHERE T.user_id = x
GROUP BY T.topic_id

编辑:缺少where子句