2017-05-05 181 views
1

我有3个表格:人物,图片和评论。人有字段ID和名称。图像是针对特定人员的,因此它具有id,person_id,image_name。而评论是一种混合表格,因为评论可以直接针对某个人或一个imaga--因此它具有字段id,person_id,image_id和评论。使用从两个不同的来源加入同一张表

同桌的两个意见,因为评论插件是这两种情况下相同的,我还需要显示实时输入所有评论因此它似乎更容易让他们在一个表中。

我现在的问题是,我如何写一个查询,给我所有的相关数据reardless如果评论是人或图像。

选择应该返回一个行,并与其他数据每个注释: 评论 IMAGE_NAME(如果评论是联系在一起image_id) PERSON_NAME(如果不考虑注释直接关系到人或图像)

问题即时通讯面对的是我真的不知道如何通过图像选择人物,如果image_id存在,并通过person_id直接选择人物。也很难寻找这种解决方案,因为它很难用文字说明。

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

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

+2

这将有助于如果你包括每个样本数据表格,你试图从数据中获得的输出,并显示你自己努力解决这个问题。你能[编辑]你的文章以包含这些信息吗? –

+0

编辑的主贴,并添加sqlfiddle – user1985273

回答

0

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

+0

不太什么即时寻找,编辑主哨,并添加sqlfiddle – user1985273

+0

我想我现在弄明白了。我确定了答案。 – Pharaoh

0

您需要将评论表制作为主表格,然后将人员和图像表格连接起来。

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 
+0

不是什么即时通讯寻找,编辑的主要帖子,并添加sqlfiddle – user1985273

1

解决方案似乎是参与人表使用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