在尝试使用网络可视化数据时遇到了以下问题。
我有两个表,一个表包含该网络中的节点(称为 Nodes ),另一个表包含连接它们的边(称为 edges )。
这是边表:
| Source| Target | ModularityClass |
|-------|--------|-----------------|
| UserA | UserB | NULL |
| UserA | UserC | NULL |
| UserC | UserD | NULL |
| UserC | UserB | NULL |
| UserE | UserB | NULL |
这是节点表:
| Username| ModularityClass |
|---------|-----------------|
| UserA | 38 |
| UserB | 11 |
| UserC | 38 |
| UserD | 23 |
| UserE | 11 |
节点表具有一个modularityClass
值,该值至少分配给2行(用户)。
我现在要做的是从 nodes 表中为具有相同值的行分配modularityClass
值(具有相同modularityClass
的用户,即重复)到 edges 表中的相应行,其中包含这两个值(用户)。然后,此示例中的最终表应如下所示:
| Source| Target | ModularityClass |
|-------|--------|-----------------|
| UserA | UserB | NULL |
| UserA | UserC | 38 |
| UserC | UserD | NULL |
| UserC | UserB | NULL |
| UserE | UserB | 11 |
这显然会导致最终表中的某些NULL
值,但这是有意的,不是问题。
因此,基本上,我需要检查另一个表中特定列中的重复值(至少两个),然后获取这些行的值并将它们与原始表的两行进行比较,然后JOIN
到modularityClass
行上。
但是,您将如何做?
答案 0 :(得分:0)
您需要两次加入Nodes
,一次加入Source
,一次加入Target
。将它们设为LEFT JOIN
,以便在没有所有匹配项时得到NULL
。
SELECT e.Source, e.Target, n2.ModularityClass
FROM edges AS e
LEFT JOIN nodes AS n1 ON n1.username = e.Source
LEFT JOIN nodes AS n2 ON n2.username = e.Target AND n1.ModularityClass = n2.ModularityClass
答案 1 :(得分:0)
如果模块化类匹配,则可以保留每个用户的节点联接。
UPDATE edges e
LEFT JOIN nodes ns
ON ns.username = e.source
LEFT JOIN nodes nt
ON nt.username = e.target
AND nt.modularityclass = ns.modularityclass
SET e.modularityclass = nt.modularityclass;
但是我建议不要物理存储可以从其他人计算得到的值。那是导致不一致的秘诀。每次更改nodes
中的值时,edges
中的模块化类可能会出错。
最好从modularityclass
放下edges
并使用一个视图,该视图显示具有模块化类的边缘。
ALTER TABLE edges
DROP COLUMN modularityclass;
CREATE VIEW edges_with_modularityclass
AS
SELECT e.source,
e.target,
nt.modularityclass
FROM edges e
LEFT JOIN nodes ns
ON ns.username = e.source
LEFT JOIN nodes nt
ON nt.username = e.target
AND nt.modularityclass = ns.modularityclass;