MySQL中的RECURSIVE查询类似于PostgreSQL

时间:2016-01-21 06:23:00

标签: mysql sql postgresql

我有一个表格,我希望根据idupline_id(父ID)字段重新获取所有行。这已在PostgreSQL中完成,如下所示:

WITH RECURSIVE downlines(id, number, upline_id, first_name, last_name, level) AS (
  SELECT id, number, upline_id, first_name, last_name, 1
  FROM mytable
  WHERE id = 2061
  UNION ALL
  SELECT a.id, a.number, a.upline_id, a.first_name, a.last_name, d.level + 1
  FROM mytable a, downlines d
  WHERE a.upline_id = d.id
)

SELECT * from downlines

但是我是MySQL新手,无法弄清楚如何将上述查询转换为MySQL版本。我在MySQL找到了这个:

select  *
from    (select * from agents order by id) products_sorted,
        (select @pv := '2061') initialisation
where   find_in_set(upline_id, @pv) > 0
and     @pv := concat(@pv, ',', id)

但是结果不匹配,在MySQL版本中缺少许多行。

有人能告诉我如何将上面的PostgreSQL查询转换为MySQL来获取递归/分层(n /未知深度)数据吗?

1 个答案:

答案 0 :(得分:0)

MySQL不支持WITH RECURSIVE。但是要解决此问题,您可以使用session variable(starting with @)来保存查询中的值。

试试这个:

SELECT a.id, a.number, a.upline_id, 
         a.first_name, a.last_name, 
         @level:=@level+1 as `level`
FROM mytable a inner join
(
    SELECT id, number, upline_id, first_name, last_name
    FROM mytable WHERE id = 2061
) d on a.upline_id = d.id  ,(select @level:=0) as p ;