如何修复多个查询连接中的重复行?

时间:2016-05-06 09:06:26

标签: mysql

我有三张桌子。

|-----------------|
| user_id |  Name |
|-----------------|
|   1     | Raj   |
|-----------------|
|   2     | Khaj  |
|-----------------|
|   3     |Khujli |
|-----------------|

|--------------------------------------|
|  post_id |  Title   |  Desc          |
|--------------------------------------|
|     1    |  test1   | hello          |
|--------------------------------------|
|     2    |  test 2  |  Hello World   |
|--------------------------------------|

|--------------------------------------------------|
|  comment_id |  post_id   | user_id   |  comment  |
|--------------------------------------------------|
|     1       |     1      |     1     | Nice      |
|--------------------------------------------------|
|     2       |     2      |     1     | Bad Thing |
|--------------------------------------------------|
|     3       |     2      |     2     |  Hulla    |
|--------------------------------------------------|
|     4       |     1      |     A     |  Lol      |
|--------------------------------------------------|
|     5       |     2      |     A     |   Arse    |
|--------------------------------------------------|
|     6       |     1      |     3     |   Nice    |
|--------------------------------------------------|

现在我正在使用查询:

SELECT *
FROM tbl_comment, tbl_post, tbl_user
WHERE tbl_post.post_id = tbl_comment.post_id 
    AND tbl_post.post_id = '$post_id' 
    AND (tbl_user.user_id = tbl_comment.user_id 
          OR (tbl_comment.user_id = 'A' 
                 AND tbl_post.post_id = '$post_id'))

user_id = 'A'表示管理员,但未列在tbl_user表中。它仅在tbl_comment表中被称为'A'

通过上述查询,我​​在user_id = 'A'对特定帖子发表的评论中获得了两行。

如何解决此问题?查看图片,两行具有相同的值。我想要唯一的行,而不是重复的行。

enter image description here

2 个答案:

答案 0 :(得分:0)

试试这个(未经过测试

SELECT *
FROM tbl_comment
INNER JOIN tbl_post ON tbl_post.post_id = tbl_comment.post_id  
LEFT JOIN tbl_user ON tbl_user.user_id = tbl_comment.user_id
WHERE tbl_comment.post_id = '$post_id'

我强烈建议使用JOIN ON子句来连接表格 - 更易读,更容易解决问题。

答案 1 :(得分:0)

您正在获取重复项,因为在WHERE子句的第二部分中,您不对 tbl_user 表施加任何限制。因此,对于 tbl_user 表中的每条记录,当评论的用户ID为“A”时,您的输出中会重复出现。

我还建议您使用ANSI语法来关注连接表,如下所示:

SELECT *
FROM       tbl_comment
INNER JOIN tbl_post
        ON tbl_post.post_id = tbl_comment.post_id
LEFT JOIN  tbl_user
        ON tbl_user.user_id = tbl_comment.user_id
WHERE      tbl_post.post_id = '$post_id' 
       AND (tbl_user.user_id IS NOT NULL OR tbl_comment.user_id = 'A')

WHERE子句中的最后一行是可选的,但如果您的注释表中存在无效的用户ID值,则可能是必要的。根据您的期望,您可能不希望输出这些记录。