2017-02-13 68 views
-1

我有一个表结构如下所示:查询孩子的名字,并返回父母

locationID  locationName parentID 
    1   Europe   0 
    2   England   1 
    3    Kent   2 

我查询按名称表,因此,如果我搜索肯特。我希望它返回欧洲>英格兰>肯特作为搜索结果。

任何人都可以指出我正确的查询方向。它是同一张桌子上的左连接吗?

+0

有多少级别正在检查?只有三个? – GurV

+0

可能更多,也许6或7 –

+0

您需要一个存储过程,然后 – GurV

回答

0

MySQL不提供递归查询的原生支持。

对于在层次结构中设置“最大”数量的层次,可以编写查询。

作为一个例子:

SELECT g0.locationName 
     , g1.locationName 
     , g2.locationName 
     , g3.locationName 
     , g4.locationName 
     , g5.locationName 
     , g6.locationName 
    FROM mytable g0 
    LEFT JOIN mytable g1 ON g1.locationId = g0.parentId 
    LEFT JOIN mytable g2 ON g2.locationId = g1.parentId 
    LEFT JOIN mytable g3 ON g3.locationId = g2.parentId 
    LEFT JOIN mytable g4 ON g4.locationId = g3.parentId 
    LEFT JOIN mytable g5 ON g5.locationId = g4.parentId 
    LEFT JOIN mytable g6 ON g6.locationId = g5.parentId 
    WHERE g0.locationName = 'Kent' 

这种方法可以扩展到的水平,G7,G8,G9的更大的数字。但是查询会强制执行最大数量的遍历。

该查询不会对“循环”执行任何检查。例如,如果“Europe”具有引用“Kent”的parentId,那将是层次结构中的循环。查询并没有做任何事情来检查这种情况,它只是跟着父母的链接,并且周围和周围的事情都会发生。

为了允许动态数量的级别,为了使它在MySQL中工作,需要一个MySQL存储程序(PROCEDURE)和一些条件逻辑;实现更多的递归方法。

0

如果层次结构只能走下来,直到3个层次则是,你可以使用self join获得所需要的数据,例如:

SELECT l3.locationName, l2.locationName, l1.locationName 
FROM location l1 JOIN location l2 ON l1.locationID = l2.parentId 
JOIN location l3 ON l2.locationID = l3.parentID 
WHERE l3.locationName = 'Kent'; 
+0

如果有更多关卡,该怎么办? –

+0

如果有更多关卡,您可以添加更多连接。 –