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

时间:2017-05-05 16:49:41

标签: php mysql

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

同一个表用于两个评论,因为评论插件在两种情况下都是相同的,我还需要在实时Feed中显示所有评论,以便将它们保存在一个表中更容易。

我现在的问题是如何编写一个查询,如果评论是针对人或图像的,那么我将无法获得所有相关数据。

选择应为每个评论返回一行并附加其他数据: 评论 image_name(如果注释与image_id绑定) person_name(无论评论是直接绑定到人还是图像)

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

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

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

3 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分: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

但是,用户1985273的答案应该更有效率。

答案 2 :(得分: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