2016-01-21 68 views
2

我有一張表,我希望根據idupline_id(父id)字段重新獲取所有行。這已經在PostgreSQL中這樣做了:MySQL中的RECURSIVE查詢類似於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 /未知深度)數據?

+0

有在MySQL沒有遞歸,但每一個遞歸可使用在存儲過程中的循環被改寫。從'level = 0'開始,將基本查詢插入/選擇到臨時表中。然後ins/sel遞歸部分加入臨時表'AND level = 0'。檢查活動計數是否大於0,如果是,請增加'等級'並重復。 – dnoeth

回答

0

MySQL不支持WITH RECURSIVE。但是爲了解決這個問題,你可以使用session variable(starting with @)來保存查詢中的值。

試試這個:

SELECT a.id, a.number, a.upline_id, 
     a.first_name, a.last_name, 
     @level:[email protected]+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 ; 
+0

這裏'temp'應該是'downlines'嗎? –

+0

@mu太短:MySQL不支持使用'temp'字創建臨時表。 –

+0

您正在創建名爲'temp'的臨時表,但查詢中包含'downlines'。那實際上會遞減? –