2017-06-21 23 views
2

我尝试让每个类别的所有父类中选择时:使用变量使用下面的查询获取所有的父节点递归

select @c := c.id_category,c.id_parent, 
(SELECT 
     GROUP_CONCAT(@r := (
     SELECT c1.id_parent 
     FROM ps_category c1 
     WHERE c1.id_category = @r 
     )) AS parent 

FROM (
     SELECT @r := @c 
     ) vars, 
     ps_category c2 
     where @r<>0) p 
from ps_category c 
join (select @c:=0) tmp 

我希望能得到这样的: id_category_id; id_parent; p 1; 0; 0 2; 1; 1,0 3; 1; 1,0 4; 2; 2,1,0 ... 但似乎什么不使用@r@c初始化,我做错了什么?

回答

1
SELECT 
     @c:=c.id_category, 
     c.id_parent, 
     (SELECT 
       GROUP_CONCAT(@r:=(SELECT 
           c1.id_parent 
          FROM 
           ps_category c1 
          WHERE 
           c1.id_category = @r)) AS parent 
      FROM 
       (SELECT @r:[email protected]) vars,(select @c:=0)Z, <!------- i had made changes at this line> 
       ps_category c2 
      WHERE 
       @r <> 0) p 
    FROM 
     ps_category c 

试试上面的查询。

正如在评论中提到你正在初始化外部查询变量@c,并且你在内部查询中使用该变量。所以我已经做了内部查询的初始化。所以自动更新的值将填充到外部查询。

希望这会帮助你。

我得到了下面的输出 enter image description here
什么是您的预期输出?

+0

虽然此查询可能是正确的答案,这将是一个好多了,如果你解释它做什么,而不是只在您的文章为之倾倒。 – Shadow

+0

@Shadow我已经更新了我的答案,并试图解释相同。 –

+0

使用@c值的内部查询在选择列表中,而不在from子句中。这样@c始终设置为0,这似乎不是OP所需要的。 – Shadow

1

我已经整理出这个问题

SELECT 
    @r:=c.id_category id_category, 
    c.id_parent, 
    (select GROUP_CONCAT(@r:=(SELECT 
          c1.id_parent 
         FROM 
          ps_category c1 
         WHERE 
          c1.id_category = @r)) AS p 
    from ps_category c2       
    ) as parents 

    FROM 
    ps_category c, 
    (select @r:=0) Z 

    group by c.id_category, c.id_parent   
相关问题