2017-01-23 13 views
1

Я использую Gephi, подключенный к базе данных MySQL. Есть две таблицы:SELECT в зависимости от значения от второй таблицы

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

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

ответ

2

Просто соединить таблицу узлов дважды таблицы ребер, как это :

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

+0

его работы хорошо. но небольшая проблема заключается в том, что он повторяет строку с меткой «2», пожалуйста, проверьте эту ссылку http://sqlfiddle.com/#!9/f7e824/1 – Shujaat

+0

Просто положите отличную оттуда – GurV

+0

работает отлично в http : //sqlfiddle.com/, но в моей локальной базе данных этот запрос возвращает нулевые результаты – Shujaat

1

сначала получить все цели, связанные с этими источниками, где этикетка «б»; затем выберите соответствующие метки в узлах.

Отредактировано: в отношении вас ожидают этикетки для обоих источника и цели Краю:

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 Fiddle.

Примечание: есть лучший подход с точки зрения производительности. Я отправляю его в другом ответе.

+0

Давайте продолжим обсуждение в чате (http://chat.stackoverflow.com/rooms/133799/discussion-between-marcm-and- Шуджаат). – MarcM

1

Другой подход:

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 fiddle

+0

этот код рабочий файл. но по-прежнему остается одна проблема, что в моей базе данных многократно извлекается/показывается строка с меткой «b». Строка с меткой «b» после друг друга. – Shujaat

+1

Проверьте свой код и сравните его с текущим ответом.Или добавьте в свой вопрос скрипт SQL, где отображается проблема. – MarcM