【问题标题】:joining 4 tables together将 4 个表连接在一起
【发布时间】:2015-09-10 23:20:25
【问题描述】:

我想知道是否有人可以帮助我。

我有 4 个表需要连接以检索我需要的数据。

评论

主题

评论主题

评论子主题

所以我想从评论中做一个简单的选择 *。有了这个,我需要来自themes 的主题名称和来自themes 的子主题名称。

评论可以有多个主题和子主题。此外,评论可能只有一个没有子主题的主题,然后是另一个有子主题的主题。

themes 表是这样的

reviewthemesreviewsubthemes 看起来像这样

评论表如下所示:

我试过了,但我太糊涂了。

所以基本上评论表包含评论。主题表是主题名称所在的位置,reviewthemes 和 reviewsubthemes 都有一个用于与reviews 表连接的 reviewID 列和一个用于连接themes 表的主题 ID。

有谁知道怎么做,你也可以解释一下查询是如何进行的。

谢谢

【问题讨论】:

  • reviews 表是什么样的?
  • @kalessin 我用评论表图片编辑了我的问题

标签: mysql sql database


【解决方案1】:

您可能需要使用reviews 作为左表来创建left join,然后根据以下任一表中的themeid 匹配主题:reviewthemesreviewsubthemes

select r.*,
       t.name
from reviews r
left join reviewthemes rt on rt.reviewId = r.reviewId
left join reviewsubthemes rst on rst.reviewid = r.reviewid
left join themes t on (t.themeid = rt.themeid or t.themeid = rst.themeid)

您也可以使用UNIONUNION ALL 来执行此操作(首选方法):

select r.*,
       t.name
from reviews r
left join reviewthemes rt on rt.reviewId = r.reviewId
left join themes t on t.themeid = rt.themeid 

union all

select r.*,
       t.name
from reviews r
left join reviewsubthemes rst on rst.reviewid = r.reviewid
left join themes t on t.themeid = rst.themeid

更新:

根据您的 cmets,答案如下:

select r.*,
       GROUP_CONCAT(t.name) as Name
from reviews r
left join reviewthemes rt on rt.reviewId = r.reviewId
left join reviewsubthemes rst on rst.reviewid = r.reviewid
left join themes t on (t.themeid = rt.themeid or t.themeid = rst.themeid)
group by r.*

【讨论】:

  • 我试过了,它确实有效,但也不完全是我想要的。这只会在每行上放置 1 个主题。因此,除了主题名称外,它可能有 5 次相同的评论。相反,如果评论有多个主题或子主题,我需要将它们放在不同列的同一行中。这可能吗?
  • 如果您想将其他主题/子主题放在同一行,请查看 Group_Concat。如果没有样本数据和预期输出,就很难想象您要达到的目标。
  • 现在我有 5 行有相同的评论。除了主题栏,一切都一样。因为有 5 个主题链接到这个特定的评论,所以它有 5 个不同的行
  • 啊哈对不起,我一定没有注意我点击的地方。我现在改了:)
  • 啊哈,那会有点难过,有人帮助并解决了问题,解决了您的问题....然后您投票给其他人,哈哈
【解决方案2】:

也许我没有完整的图片,但你可能有太多的表格,Review 表格中的一个 themeID 字段加上一个主题/子主题标志就足够了。 不管怎样,试试这个:

select r.*, t.name
  from reviews as r
  left join reviewthemes as rt on r.themeID = rt.themeID
  left join reviewsubthemes as rst on r.themeID = rst.themeID
  left join themes as t on r.themeID = t.themeID

如果 themeID 字段具有您想要的 ID 而不是 ID 字段,这应该可以工作。根据需要向选择中添加更多字段。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-01-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-04
    • 2012-11-16
    相关资源
    最近更新 更多