Значения MySQL JOIN из другой таблицы, основанные на (дублирующих) значениях из исходной таблицы в этой таблице - PullRequest
0 голосов
/ 04 января 2019

При попытке работать с данными из сетевой визуализации я столкнулся со следующей проблемой.

У меня есть две таблицы, одна из которых содержит узлы в этой сети (называемые узлами ), а другая - ребра, соединяющие их (называемые ребра ).

Это таблица ребер :

| 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, которое назначается как минимум двум строкам (Пользователи).

Теперь я хочу назначить значение modularityClass из таблицы узлов для строк, имеющих одинаковое значение (пользователи с одинаковыми modularityClass то есть дубликатами ) для соответствующая строка в таблице dge , которая содержит оба этих значения (Users). Финальная таблица в этом примере должна выглядеть следующим образом:

| Source| Target | ModularityClass |
|-------|--------|-----------------|
| UserA | UserB  | NULL            |
| UserA | UserC  |       38        |
| UserC | UserD  | NULL            |
| UserC | UserB  | NULL            |
| UserE | UserB  |       11        |

Это, очевидно, приведет к определенным значениям NULL в финальной таблице, но это не является проблемой.

Таким образом, в основном мне нужно проверить другую таблицу на наличие дублирующихся значений (как минимум, двух) в определенном столбце, затем получить значения этих строк и сравнить их с двумя строками исходной таблицы и JOIN из них на * 1 039 * строка.

Однако, как бы вы это сделали?

Ответы [ 2 ]

0 голосов
/ 04 января 2019

Вы можете присоединиться к узлам слева для каждого пользователя, и если класс модульности совпадает.

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;

дБ <> скрипка

0 голосов
/ 04 января 2019

Вам нужно присоединиться с 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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...