我有一个表格,其中存储了user_id
和parent_user_id
。例如:
user_id parent_user_id
--------------------------
1 0
2 1
3 2
4 3
5 4
现在,如果我想知道user_id
5的深度(即5),我怎么能得到它?我尝试了SOF中提到的很多查询但没有解决我的问题。我想要的只是查询通过遍历5→4,4-> 3 ... 1-> 0来告诉我深度。请帮帮我们。
更新:
我尝试了一些查询
select user_id, @pv:=parent_id as 'parent_id' from user_referral
join
(select @pv:=7)tmp
where user_id=@pv;
SELECT t1.user_id, t1.parent_id FROM
user_referral AS t1 LEFT JOIN user_referral as t2
ON t1.user_id = t2.parent_id
WHERE t2.user_id = 9 ORDER BY t2.referral_id;
但没有一个按预期工作。一个有趣的事情,没有一个以递归的方式给我答案,每个查询只给了1个记录!
我尝试过的一些链接:
答案 0 :(得分:1)
一些RDBMS产品提供内置的分层查询。例如,Oracle SQL has一个START WITH ... CONNECT BY
语法。
但不是MySQL。你必须以某种方式伪造它。一种方法是检索数据并在应用程序的内存中构建层次结构。
另一种方法是使用一系列LEFT JOIN
操作,这些操作比预期的层次结构深度更长。这个查询有点难看,但它确实有效。这种查询的每一行都包含该行的“族谱”。以下是您的数据示例(http://sqlfiddle.com/#!2/128372/4/0):
select a.user_name,
COALESCE(g.user_id, f.user_id, e.user_id, d.user_id, c.user_id, b.user_id, a.user_id) root,
(a.user_id IS NOT NULL) + (b.user_id IS NOT NULL) + (c.user_id IS NOT NULL) +
(d.user_id IS NOT NULL) + (e.user_id IS NOT NULL) + (f.user_id IS NOT NULL) +
(g.user_id IS NOT NULL) depth
from hier a
left join hier b on a.parent_user_id = b.user_id
left join hier c on b.parent_user_id = c.user_id
left join hier d on c.parent_user_id = d.user_id
left join hier e on d.parent_user_id = e.user_id
left join hier f on e.parent_user_id = f.user_id
left join hier g on f.parent_user_id = g.user_id
order by depth DESC
在Oracle层次结构查询中编码为CONNECT BY parent_user_id = user_id
的逻辑在此处显示为重复ON
操作的重复LEFT JOIN
子句。