好的,在this question之后,我意识到我正在尝试的JOIN不幸没那么直接。
要修改上一个查询,表中的外键会创建一个层次结构,只有当条目位于顶层时才会填充引用。
所以我需要实现的是获取电缆的area.name
(使用this fiddle)条目,但我的选择中不需要其余的层次结构。
显然,我之前的尝试错过了major_parent
字段有时为空的事实。
这是我原来的疑问:
SELECT
C.name,
S.name AS Origin,
M.area AS OriginArea
FROM cable C
INNER JOIN sub S ON C.sub = S.sub_id
INNER JOIN major M ON S.major_parent = M.major_id
WHERE
# Parameters
;
答案 0 :(得分:1)
以下是此查询的fiddle:
SELECT
cable.`name`,
sub.`name`,
major.`name`,
major.area
FROM
cable
INNER JOIN sub
ON cable.sub = sub.sub_id
LEFT JOIN sub AS parent
ON parent.sub_id = sub.sub_parent
INNER JOIN major
ON major.major_id = COALESCE (parent.major_parent,sub.major_parent)
INNER JOIN area
ON area.area_id = major.area
这样您的层次结构就变成了可选的。如果sub
中的条目具有父级,则左联接将找到它,如果不是,则左联接将返回null
,但COALESCE (parent.major_parent, sub.major_parent)
将跳过null
并且使用sub.major_parent
加入major
表。
修改强>
我认为我使用sub_parent = major_parent
搞砸了与父子的连接。应该是sub_parent = sub_id
不应该吗?
LEFT JOIN sub AS parent
ON parent.sub_id = sub.sub_parent
还将其添加到顶部的整个查询中。