SELECT 取决于第二个 table 的值

SELECT depending on value from second table

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

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(边 table)的值应对应于 id(节点 table)。我想要一个查询到:

  1. Select 来自节点 table,其中 labelb.
  2. b
  3. id2,因此 select 来自边 table 的这些值,其中 source2 .
  4. 现在 target 值为 3, 1, 4,其中 source2,因此 select 这些值来自节点 table,其中 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

只需将节点 table 与边 table 连接两次,如下所示:

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

首先获取与标签为'b'的源相关的所有目标;然后 select 节点中的相关标签。

已编辑:关于您期望边缘的源和目标标签:

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.

中进行测试

注意:在性能方面有更好的方法。我post在另一个回答里。

另一种方法:

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

测试