来自另一个表的MySQL JOIN值基于该表中原始表的(重复)值

时间:2019-01-03 21:09:13

标签: mysql database row multiple-columns

在尝试使用网络可视化数据时遇到了以下问题。

我有两个表,一个表包含该网络中的节点(称为 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值,但这是有意的,不是问题。

因此,基本上,我需要检查另一个表中特定列中的重复值(至少两个),然后获取这些行的值并将它们与原始表的两行进行比较,然后JOINmodularityClass行上。

但是,您将如何做?

2 个答案:

答案 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

DEMO

答案 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;

db<>fiddle