选择5个表创建几乎重复的行

时间:2014-09-16 13:46:26

标签: mysql group-by left-join

我有一个数据库,我必须得到评论的名称在哪里是相关评论,我还需要获得发表评论的人的用户名。

为了做到这一点,我必须通过5个表,因为评论表jamacomments没有直接连接到评论表review

我可以通过以下方式获得评论名称:

  • 将表格revision_user与jamacomments
  • 联系起来
  • 然后将revision_user表与用户表userbase
  • 连接起来
  • 然后将revision_user表加入修订表revision,这是刚刚更新的评论
  • 然后将修订表加入评论表review

我的SQL查询:

select jamacomment.id, jamacomment.userId, jamacomment.commentText,
userbase.id, userbase.userName,
revision_user.userId, revision_user.revisionId,
revision.id, revision.reviewId, review.id, review.name
from jamacomment

left join revision_user
on jamacomment.userId=revision_user.userId
left join userbase
on revision_user.userId=userbase.id
left join revision
on revision_user.revisionId=revision.id
left join review
on revision.reviewId=review.id

group by jamacomment.id

可能会更清楚地澄清一些事情:

  • jamacomment.userId是外键userbase.id
  • revision_user.userId是userbase.id的外键(因此它与jamacomment.userId相同)
  • revision_user.revisionId是revision.id的外键
  • revision.reviewId是review.id
  • 的外键

所以我可以从jamacomment到revision_user从修订版到修订版再到修订版。

它留下了太多记录,它复制了一些数据,但并不完整。这是一个重复的特定点,它给出了随机的revisionId数字,其余的数据也是错误的。

使用group by我只选择唯一的jamacomment.id,因为只有那么多行才会有评论。但是它会以我想要的错误记录来检索我。它显示了一些正确的行,但有些数据不是注释数据,而是不同的注释数据。

也许我有错误的选择或错误的左连接或我应该使用其他类型的连接,无论如何,我可以使用任何帮助,以获得每个评论的正确数据。


添加带有数据的虚拟表以便更好地理解

table 'userbase'    table 'jamacomment'  
id  | userName      id  | userId  | commentText

1   | Peter         1   | 2       | First comment review1
2   | Jack          2   | 2       | Second comment review1
3   | Ann           3   | 1       | Comment in first review
                    4   | 1       | Comment in second review
                    5   | 1       | Comm in 2nd review 2nd revision
                    6   | 3       | Comment in review1 2nd revision


table 'revision_user'      table 'revision'                  table 'review'
userId  | revisionId       id  | reviewId  | sequence        id  | name

2  | 1                     1   | 1         | 1               1   | review1
2  | 1                     2   | 2         | 1               2   | review2
1  | 1                     3   | 1         | 2   
1  | 2                     4   | 2         | 2
1  | 4
3  | 3

预期结果应为:

table 'jamacomment'                        'userbase'   'revision_user'   'revision'           'review'
id|userId |commentText                     |id |userName |userId |revisionId |id |reviewId |sequence|id|name

1 |2      |First comment review1           |2  |Jack     |2      |1          |1  |1        |1       |1 |review1  
2 |2      |Second comment review1          |2  |Jack     |2      |1          |1  |1        |1       |1 |review1
3 |1      |Comment in first review         |1  |Peter    |1      |1          |1  |1        |1       |1 |review1
4 |1      |Comment in second review        |1  |Peter    |1      |2          |2  |2        |1       |2 |review2
5 |1      |Comm in 2nd review 2nd revision |1  |Peter    |1      |4          |4  |2        |4       |2 |review2
6 |3      |Comment in review1 2nd revision |3  |Ann      |3      |3          |3  |1        |2       |1 |review1

忘记添加信息,它应该在revisionId的某个地方断开,它将数据的副本复制到revisionId但在revisionId中将id更改为这些行。它为每个项目添加了3个重复项。其余信息指的是不正确的revisionId。我认为它有3个重复,因为我有3个评论或3个修订,一个评论。

它显示了128条没有分组的记录。 with group by显示正确的36条记录,但它会得到一些正确的记录和一些不正确的记录。

1 个答案:

答案 0 :(得分:0)

如果您只想获得在您加入的桌子上找到的匹配记录,则左连接将使用内部联接填充您的结果。