在mysql中查找用户的深度

时间:2015-01-31 16:28:23

标签: mysql

我有一个表格,其中存储了user_idparent_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个记录!

我尝试过的一些链接:

Link1

Link2

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子句。