ВЫБРАТЬ в зависимости от значения из второй таблицы
Я использую Gephi, подключенный к базе данных MySQL. Есть две таблицы:
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
изb
является2
, поэтому выберите эти значения из таблицы Edges, гдеsource
является2
,- Сейчас
target
значение3, 1, 4
гдеsource
является2
, поэтому выберите эти значения из таблицы узлов, где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
3 ответа
Решение
Просто соедините таблицу узлов дважды с таблицей ребер следующим образом:
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"; затем выберите соответствующие метки в узлах.
Отредактировано: относительно вас ожидают метки как для источника, так и для цели 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.
Примечание: есть лучший подход с точки зрения производительности. Я отправляю это в другом ответе.
Другой подход:
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'
Тест в скрипте SQL