如何在MySQL表中递归选择所有父项?
结构是这样的:
id name parent_id
-----------------------
1 namelvl1 null
2 namelvl2 1
3 namelvl3 2
依旧......
如何获取id = 3的所有父母的列表?
答案 0 :(得分:1)
<强> 1。效率低下的解决方案
以下解决方案有效,但在效率方面却很糟糕。它总是读取表格的所有行(即使你只需要三行),然后排除你不需要的那些行。 它改编自article:
SELECT @r AS _id,
(
SELECT @r := parent_id
FROM my_table
WHERE id = _id
) AS parent,
@l := @l + 1 AS lvl
FROM (
SELECT @r := 3, -- starting node = 3
@l := 0,
@cl := 0
) vars,
my_table h
WHERE @r <> 0
我能说什么......它有效。问题是它只是在桌子上进行全表扫描。如果桌子很大,这可能会非常昂贵。
<强> 2。标准分层查询
从版本8.0开始MySQL(未发布为稳定版)正式支持根据SQL标准进行分层查询。
如果您可以升级到8.0版,则可以运行常规的分层查询。
第3。使用MariaDB
现在,如果您可以使用MariaDB(最初是MySQL的克隆),则从版本10.2.2开始使用标准SQL已经可以使用分层查询。