我正在使用连接到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
source
和target
(边缘表)的值应与id
(节点表)对应。我希望一个查询:
label
为b
。id
的{li> b
为2
,因此请从source
为2
的Edges表中选择这些值。
target
值为3, 1, 4
,其中source
为2
,因此请从id
为3, 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
答案 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'
中进行测试