2017-01-23 137 views
1

我正在使用Gephi,連接到MySQL數據庫。有兩個表:選擇取決於第二個表的值

Nodes 

**id | label** 
---------------- 
    1 | a 
    2 | b 
    3 | c 
    4 | d 

Edges 

**source | target** 
---------------- 
     4 | 3 
     1 | 2 
     2 | 3 
     3 | 1 
     2 | 1 
     2 | 4 

sourcetarget(邊緣表)應與id(節點表)。我想一個查詢:

  1. 選擇節點表,其中labelb
  2. idb2,所以從邊緣表中選擇這些值,其中source2
  3. 現在target值爲3, 1, 4其中source2,所以選擇從節點表,其中id3, 1, 4這些值。

我嘗試此查詢,但它不給正確的結果:

SELECT id, label FROM nodes WHERE id IN(
    SELECT target FROM edges WHERE target In(
    SELECT id FROM nodes WHERE label = 'b' 
    ) 
) 

結果應該是這樣的:

**id | label** 
---------------- 
    2 | b 
    3 | c 
    1 | a 
    4 | d 

回答

2

就在與邊桌喜歡這個連接的節點表兩次:

SELECT distinct n2.* 
FROM nodes n1 
JOIN edges e on n1.id = e.source 
JOIN nodes n2 on n2.id in (e.source, e.target) 
WHERE n1.label = 'b' 

演示 @SQLFiddle

+0

其工作的罰款。但有一個小問題是,它是重複行與標籤「2」,請檢查此鏈接http://sqlfiddle.com/#!9/f7e824/1 – Shujaat

+0

只是把一個明顯的在那裏 – GurV

+0

正在罰款在HTTP ://sqlfiddle.com/但在我的本地數據庫中,此查詢返回零結果 – Shujaat

1

首先獲得所有相關的來源,其中的標籤是 'B' 的目標;然後選擇節點中的相關標籤。

編輯:關於你期待源和目標邊緣的標籤:

SELECT * FROM Nodes 
WHERE id IN (
    SELECT source FROM Edges 
    JOIN Nodes ON Edges.source = Nodes.id 
    WHERE Nodes.label = 'b' 
) 
OR 
id IN (
    SELECT target FROM Edges 
    JOIN Nodes ON Edges.source = Nodes.id 
    WHERE Nodes.label = 'b' 
) 

測試它在這個SQL Fiddle

注意:在性能方面有更好的方法。我在另一個答案中發佈它。

+0

讓我們[在聊天中繼續討論](http://chat.stackoverflow.com/rooms/133799/discussion-between-marcm-and-舒賈特)。 – MarcM

1

一種不同的方法:

SELECT nodes_tmp.* 
FROM nodes 
JOIN edges ON nodes.id = edges.source 
JOIN nodes AS nodes_tmp ON (nodes_tmp.id = edges.source OR nodes_tmp.id = edges.target) 
WHERE nodes.label = 'b' 

測試中SQL fiddle

+0

此代碼是工作文件。但有一個問題仍然存在,即在我的數據庫中,它多次檢索/顯示帶有標籤'b'的行。在每一行之後用標籤'b'行。 – Shujaat

+1

檢查您的代碼並將其與當前答案進行比較。或者向你的問題添加一個SQL小提琴,該問題顯示在哪裏。 – MarcM

相關問題