1

我有 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 但我已经以这种方式创建了我的数据库。您能帮助实现这一目标吗?

4

3 回答 3

2

下面的查询在子查询中使用UNION。第一个 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 = ?
于 2013-04-02T06:43:17.053 回答
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查询的子句。

于 2013-04-02T06:42:04.467 回答
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 子句

于 2013-04-02T07:00:28.240 回答