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
source
和 target
(边 table)的值应对应于 id
(节点 table)。我想要一个查询到:
- Select 来自节点 table,其中
label
是 b
.
b
的 id
是 2
,因此 select 来自边 table 的这些值,其中 source
是 2
.
- 现在
target
值为 3, 1, 4
,其中 source
为 2
,因此 select 这些值来自节点 table,其中 id
是 3, 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'
测试
我正在使用 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
source
和 target
(边 table)的值应对应于 id
(节点 table)。我想要一个查询到:
- Select 来自节点 table,其中
label
是b
. id
是2
,因此 select 来自边 table 的这些值,其中source
是2
.- 现在
target
值为3, 1, 4
,其中source
为2
,因此 select 这些值来自节点 table,其中id
是3, 1, 4
.
b
的 我试过这个查询,但没有给出正确的结果:
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'
测试