我有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但我不知道如何选择它。
答案 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