我有一个表结构如下所示:查询孩子的名字,并返回父母
locationID locationName parentID
1 Europe 0
2 England 1
3 Kent 2
我查询按名称表,因此,如果我搜索肯特。我希望它返回欧洲>英格兰>肯特作为搜索结果。
任何人都可以指出我正确的查询方向。它是同一张桌子上的左连接吗?
我有一个表结构如下所示:查询孩子的名字,并返回父母
locationID locationName parentID
1 Europe 0
2 England 1
3 Kent 2
我查询按名称表,因此,如果我搜索肯特。我希望它返回欧洲>英格兰>肯特作为搜索结果。
任何人都可以指出我正确的查询方向。它是同一张桌子上的左连接吗?
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)和一些条件逻辑;实现更多的递归方法。
如果层次结构只能走下来,直到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';
如果有更多关卡,该怎么办? –
如果有更多关卡,您可以添加更多连接。 –
有多少级别正在检查?只有三个? – GurV
可能更多,也许6或7 –
您需要一个存储过程,然后 – GurV