繁体   English   中英

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

[英]Join on the same table from two different sources

我有3张桌子:人物,图片和评论。 人员具有字段ID和名称。 图片是针对特定人物的,因此具有ID,person_id,image_name。 注释是一种混合表,因为注释可以直接用于一个人或一个图像-因此它具有字段id,person_id,image_id和comment。

两个评论都使用同一张表,因为这两种情况的评论插件都相同,我还需要在实时供稿中显示所有评论,因此将它们保存在一个表中似乎更容易。

我现在的问题是,如果评论是针对个人还是针对图像,我该如何编写一个查询,使我所有相关数据都毫无保留。

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

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

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

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

解决方案似乎是使用OR将人员表与人员和图像连接在一起,并根据存在的对象将其连接:

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

您可以使用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的答案应该更有效。

您需要将注释表作为主表,然后离开联接人和图像表。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM