2012-04-01 11 views
3

Ich habe 2 Tabellen: edges und usersMySQL Ecken & Kanten Kreuzung

edges (mit Einschränkung: id1 < ID2):

id1 
name1 
id2 
name2 

users:

id 
name 

Ich möchte um eine Ergebnismenge von nur Kanten (ID1, Name1, ID2, Name2) zu erhalten, so dass BEIDE ID1 und ID2 in der Benutzertabelle sind. Das scheint ziemlich einfach zu sein, aber ich habe Probleme, es zu bekommen. Mein Versuch:

SELECT 
    e.id1 AS id1, 
    e.name1 AS name1, 
    e.id2 AS id2, 
    e.name2 AS name2 
FROM 
    edges AS e, 
    users AS u 
WHERE u.id = e.id1 

UNION 

SELECT 
    e.id1 AS id1, 
    e.name1 AS name1, 
    e.id2 AS id2, 
    e.name2 AS name2 
FROM 
    edges AS e, 
    users AS u 
WHERE u.id = e.id2 

Irgendwelche Zeiger?

+0

Was ist Ihr Problem? – Arion

Antwort

1

Versuchen Sie es mit zwei INNER wie folgt JOINS:

SELECT * FROM edges e 
JOIN users u1 ON e.name1 = u1.name 
JOIN users u2 ON e.name2 = u2.name 
+0

Das funktioniert! Es ist ein bisschen langsam, aber ich nehme an, der erste JOIN ist eine 'O (| V | * | E |)' Operation, so dass diese Joins zusammen eine Laufzeit von 'O (| V | * | E |^2) ergeben würden. '? Wahrscheinlich das Beste, was wir hier machen können? – lollercoaster

+0

Erstellen Sie einen Index für die drei Namensfelder, um die Leistung zu verbessern. – jordeu

+0

Ich bin mir nicht sicher, aber ich denke, wenn Ihre Benutzer-Tabelle kleiner ist als die Kanten-Tabelle, können Sie zuerst einen RECHTEN JOIN und dann einen LINKEN JOIN machen und es wird die Abfrage beschleunigen. – jordeu

0

Vielleicht so etwas wie:

SELECT 
    e.id1 AS id1, 
    e.name1 AS name1, 
    e.id2 AS id2, 
    e.name2 AS name2 
FROM 
    edges AS e 
WHERE EXISTS 
    (
     SELECT 
     NULL 
     FROM 
     users AS u 
     WHERE 
     u.id = e.id1 
     AND u.id = e.id2 
) 
+0

hmm das gibt die leere Menge zurück? – lollercoaster

+0

Nein. Es gibt die Eges zurück, die Benutzer haben. – Arion

1

Geben Sie diesem einen Versuch:

select e.id1, e.name1, e.id2, e.name2 from edges e 
join users u1 on e.id1 = u1.id 
join users u2 on e.id2 = u2.id 
+0

ja das ist @ jordeu aber hier werden Sie die doppelten Spalten los, was ist das gewünschte. irgendwelche Gedanken über die Laufzeit wie ich oben gefragt habe? – lollercoaster