从两个不同的来源加入同一张表

Posted

技术标签:

【中文标题】从两个不同的来源加入同一张表【英文标题】:Join on the same table from two different sources 【发布时间】:2017-05-05 16:49:41 【问题描述】:

我有 3 个表:人物、图像和评论。人员具有字段 id 和 name。图像是针对特定人的,因此它具有 id、person_id、image_name。评论是一种混合表,因为评论既可以直接针对个人,也可以针对形象——因此它具有字段 id、person_id、image_id 和 comment。

两个 cmets 使用同一张表,因为这两种情况下的评论插件是相同的,而且我还需要在实时提要中显示所有 cmets,因此将它们放在一个表中似乎更容易。

我现在的问题是,如果评论是针对人的还是针对图像的,我如何编写一个查询,以提供所有相关数据而无需考虑。

Select 应该为每个带有附加数据的评论返回一行: 评论 image_name(如果评论绑定到 image_id) person_name(无论评论是直接与人或图像相关联)

我面临的问题是,如果存在 image_id,我真的不知道如何通过图像选择人,否则直接通过 person_id 选择人。也很难找到这种解决方案,因为它很难用语言表达。

编辑,添加 sqlfiddle: http://sqlfiddle.com/#!9/7fa06a/1

目前缺少的是第二行的人员数据。该数据应该可用,因为图像表有 person_id 但我不知道如何选择它。

【问题讨论】:

如果您包含来自每个表的示例数据、您尝试从该数据中获取的输出,并展示您自己解决此问题的努力,这将有所帮助。你能edit你的帖子包含这些信息吗? 编辑了主帖并添加了sqlfiddle 【参考方案1】:

解决方案似乎是使用 OR 将 person 表与 person 和 image 结合起来,并根据存在的哪一个来加入:

SELECT * 
FROM comment 
LEFT JOIN image ON image.id = comment.image_id
LEFT JOIN person ON person.id = image.person_id OR
          person.id = comment.person_id

【讨论】:

【参考方案2】:

您需要将评论表作为主表,然后左连接人物和图像表。

Select *  from comment c left join person p on p.id=c.person_id left join image i on i.image_id=i.id and i.person_id=c person_id

【讨论】:

不是我要找的,编辑了主帖并添加了 sqlfiddle【参考方案3】:

您可以使用COALESCE() 做到这一点。它返回不是NULL 的第一个参数。

SELECT comment.comment, image.name, COALESCE(person.name, image_person.name)
FROM comment
LEFT JOIN person on person.id = comment.person_id
LEFT JOIN image ON image.id = comment.image_id
LEFT JOIN person image_person ON image_person.id = image.person_id

不过,user1985273 的回答应该更有效率。

【讨论】:

不是我要找的,编辑了主帖并添加了 sqlfiddle 我想我现在明白了。我确定了答案。

以上是关于从两个不同的来源加入同一张表的主要内容,如果未能解决你的问题,请参考以下文章

避免多次加入同一张表

将同一张表映射到两个不同的列表

SQL select同一张表,两个不同的顺序

MYSQL从同一张表中选择不同的记录

MySql:从同一张表的三个不同列中提取不同的条目

加入表两次 - 在同一个表的两个不同列上