SELECT取决于第二个表中的值

时间:2017-01-23 09:27:19

标签: mysql sql join nodes edges

我正在使用连接到MySQL数据库的Gephi。有两个表:

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. 的节点表中进行选择 id的{​​li> b2,因此请从source2的Edges表中选择这些值。
  3. 现在target值为3, 1, 4,其中source2,因此请从id3, 1, 4的节点表中选择这些值。< / LI>

    我尝试了这个查询,但它没有给出正确的结果:

    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
    

3 个答案:

答案 0 :(得分:2)

只需使用edge表连接节点表两次:

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

答案 1 :(得分:1)

首先获取与标签为'b'的那些来源相关的所有目标;然后在节点中选择相关标签。

已编辑:关于Edge的源和目标的标签:

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中进行测试。

注意:在性能方面有更好的方法。我将其发布在另一个答案中。

答案 2 :(得分: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

中进行测试