ВЫБРАТЬ в зависимости от значения из второй таблицы

Я использую 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 (Таблица узлов). Я хочу, чтобы один запрос:

  1. Выберите из таблицы узлов, где label является b,
  2. id из b является 2, поэтому выберите эти значения из таблицы Edges, где source является 2,
  3. Сейчас 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

Другие вопросы по тегам