2012-04-01 115 views
3

我有2個表:edgesusersMySQL的頂點與邊緣相交

edges(與約束:ID1 < ID2):

id1 
name1 
id2 
name2 

users

id 
name 

我想得到只有邊的結果集(id1,name1,id2,name2),使得BOTH id1和id2在users表中。這看起來很簡單,但我很難得到它。我的嘗試:

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 

任何指針?

+0

你有什麼問題? – Arion 2012-04-01 17:57:57

回答

1

使用兩個內層try JOINS這樣的:

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

這個工程!它有點慢,但我認爲第一個JOIN是一個'O(| V | * | E |)'操作,所以這些連接在一起會產生'O(| V | * | E |^2) '?可能是我們在這裏能做的最好的? – lollercoaster 2012-04-01 18:15:56

+0

在三個名稱字段上創建索引以提高性能。 – jordeu 2012-04-01 18:19:57

+0

我不確定,但我認爲如果你的用戶表比邊緣表小,你可以先做一個RIGHT JOIN然後LEFT JOIN,它會加快查詢速度。 – jordeu 2012-04-01 18:22:54

0

也許是這樣的:

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

嗯,這將返回空集? – lollercoaster 2012-04-01 18:05:35

+0

不會。它返回有用戶的eges。 – Arion 2012-04-01 18:34:00

1

試試這個:

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

是的,這是@ jordeu的,但在這裏你擺脫了重複的列,這是所期望的。我在上面想到的對運行時的任何想法? – lollercoaster 2012-04-01 18:17:53

相關問題