2017-06-21 48 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   
相關問題