2016-04-09 95 views
2

我想要獲得滿足父子關係的所有行。 例如從mysql中的同一個表中獲取父子關係的所有數據

id   Title parent_id 
    1200  A  1000 
    1201  B  1000 
    1202  C  1000 
    1203  D  1000 
    1204  E  1200 
    1205  F  1200 
    1206  G  1201 
    1207  H  1205 
    1208  I  1205 
    1209  J  1205 

現在我有1209的ID,我想要檢索滿足父子關係船爲1209喜歡這裏1209關於1205,1205關於1200的所有行,和1200涉及到1000

我嘗試這個查詢

SELECT * FROM `category` a left join category b on a.id=b.parent_id where a.id=1209 

但是,這是給我的只有一個記錄。我們試圖獲取所有與這種關係相關的行。

+0

的MySQL有層次關係/遞歸查詢的支持很少。你可能會覺得這很有趣:http://stackoverflow.com/questions/4048151/what-are-the-options-for-storing-hierarchical-data-in-a-relational-database。 –

+0

謝謝。有趣的話題。但是沒有太多時間來簡要閱讀。我會在稍後閱讀。 –

+0

select * from category as child join parent.parent_id = child.id 這個查詢給我所有的數據,但是當我傳入id = 1209的時候,然後它再給我一行。 –

回答

5

如果你只是在尋找它的父母,祖父母,偉大的家長,你可以使用這樣的東西。

SELECT id,title,parent_id FROM 
    (SELECT id,title,parent_id, 
     CASE WHEN id = 1209 THEN @id := parent_id 
      WHEN id = @id THEN @id := parent_id 
      END as checkId 
    FROM Test 
    ORDER BY id DESC) as T 
WHERE checkId IS NOT NULL 

sqlfiddle

和公正的,如果你想找到所有兒童的情況下,和孫子女或ID的大孫子,你可以使用這個

SELECT id,title,parent_id FROM 
    (SELECT id,title,parent_id, 
      CASE WHEN id = 1200 THEN @idlist := CONCAT(id) 
       WHEN FIND_IN_SET(parent_id,@idlist) THEN @idlist := CONCAT(@idlist,',',id) 
      END as checkId 
    FROM Test 
    ORDER BY id ASC) as T 
WHERE checkId IS NOT NULL 

sqlfiddle for finding children

查詢找到所有父母/祖父母/多個孩子的偉大祖父母

SELECT id,title,parent_id FROM 
(SELECT id,title,parent_id, 
     CASE WHEN id in (1209,1206) THEN @idlist := CONCAT(IFNULL(@idlist,''),',',parent_id) 
      WHEN FIND_IN_SET(id,@idlist) THEN @idlist := CONCAT(@idlist,',',parent_id) 
      END as checkId 
FROM Test 
ORDER BY id DESC)T 
WHERE checkId IS NOT NULL 

sqlfiddle

+0

太好了。我可以在第n級使用這個嗎? –

+0

是啊試一下,只要你的孩子的ID總是大於父母的ID它應該工作 –

+0

是的。我認爲這總是大於父母的身份證。 它的工作。謝謝。我花了6個小時,但失敗了。 –

相關問題