2017-01-23 132 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

相关问题