基于Heirarchical数据的SQL查询到JOIN

时间:2016-06-30 05:12:42

标签: mysql join

好的,在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
;

1 个答案:

答案 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

还将其添加到顶部的整个查询中。