2010-07-02 49 views
1

我有存儲在表中的大圖的鄰接列表。MySQL:提取子圖?

v1 | v2 
1 | 2 
1 | 3 
1 | 4 
2 | 5 
3 | 5 
3 | 6 
4 | 7 
7 | 9 
5 | 10 

我試圖提取圖2跳遠離說頂點1,使其返回從上面的列表中的所有邊緣除(7,9)和(5,10)。我管理這個:

SELECT * FROM stub_graph WHERE v1 IN (SELECT v1 FROM stub_graph WHERE v1=1 UNION select v2 FROM stub_graph WHERE v1=1) ; 

我不是特別滿意我的原因有兩個解決方案:

  1. IN
  2. 這是能夠 提取鏈接,如1-2和2存在-5 但我無法提取鏈接 ,如6-7。

有沒有很好的方法來做到這一點?

萬一有人有興趣在創建表時,這裏的SQL代碼:

create table stub_graph(v1 int(11), v2 int(11)); 
insert into stub_graph VALUES(1,2); 
insert into stub_graph VALUES(1,3); 
insert into stub_graph VALUES(1,4); 
insert into stub_graph VALUES(2,5); 
insert into stub_graph VALUES(3,5); 
insert into stub_graph VALUES(3,6); 
insert into stub_graph VALUES(4,7); 
insert into stub_graph VALUES(6,7); 
insert into stub_graph VALUES(7,9); 
insert into stub_graph VALUES(5,10); 

回答

2

試試這個:

SELECT g1.v1 as Root, g2.v1 as Next g3.v1 as Final FROM stub_graph g1 
    LEFT JOIN stub_graph g2 on g2.v1 = g1.v2 
    LEFT JOIN stub_graph g3 on g3.v1 = g2.v2 
WHERE g1.v1 = 1 

如果你想(6-7),但你需要去因爲它距離1(1-3,3-6,6-7)3跳。

如果你想要任意深入,你需要看看遞歸存儲過程,我認爲MySQL的後續版本支持,但這看起來適合你的需求。或者,下面的鏈接還有一些其他的想法。

應該產量:

Root | Next | Final 
    1 | 3 |  5 
    1 | 3 |  6 
    1 | 2 |  5 
    1 | 4 |  7 

也見this link on Hierarchical Data