2017-01-23 1 views
1

J'utilise Gephi, connecté à une base de données MySQL. Il y a deux tables:SELECT en fonction de la valeur de la deuxième table

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 

Valeurs pour source et target (tableau de bords) doit correspondre à id (tableau nœuds). Je veux une requête:

  1. Sélectionnez de la table où les nœuds label est b.
  2. id de b est 2, donc sélectionnez ces valeurs dans la table Edges où source est 2.
  3. maintenant target valeur est 3, 1, 4source est 2, sélectionnez donc ces valeurs de la table où les nœuds id est 3, 1, 4.

J'ai essayé cette requête, mais il ne donne pas des résultats corrects:

SELECT id, label FROM nodes WHERE id IN(
    SELECT target FROM edges WHERE target In(
    SELECT id FROM nodes WHERE label = 'b' 
    ) 
) 

Résultat devrait ressembler à ceci:

**id | label** 
---------------- 
    2 | b 
    3 | c 
    1 | a 
    4 | d 

Répondre

2

Juste le joindre à la table des nœuds deux fois avec table bords comme celui-ci :

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' 

Demo @SQLFiddle

+0

sa fin de travail. mais un petit problème est là, qu'il répète rangée avec l'étiquette "2", s'il vous plaît vérifier ce lien http://sqlfiddle.com/#!9/f7e824/1 – Shujaat

+0

Il suffit de mettre un distinct dans là – GurV

+0

fonctionne bien dans http : //sqlfiddle.com/ mais dans ma base de données locale, cette requête renvoie zéro résultat – Shujaat

1

d'abord obtenir toutes les cibles liées à ces sources où l'étiquette est 'b'; puis sélectionnez les étiquettes associées dans les nœuds.

Modifié: en ce qui concerne que vous attendez des étiquettes pour la source et la cible de l'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' 
) 

test dans ce SQL Fiddle.

Remarque: il existe une meilleure approche en termes de performances. Je l'affiche dans une autre réponse.

+0

Laissez-nous [continuer cette discussion dans le chat] (http://chat.stackoverflow.com/rooms/133799/discussion-between-marcm-and- shujaat). – MarcM

1

Une approche différente:

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' 

test dans SQL fiddle

+0

ce code est fichier de travail. mais un problème persiste: dans ma base de données, il récupère/affiche plusieurs fois la ligne portant l'étiquette «b». Rangée avec l'étiquette «b» après l'autre rangée. – Shujaat

+1

Vérifiez votre code et comparez avec la réponse actuelle.Ou ajoutez à votre question un violon SQL où le problème est montré. – MarcM