2010-10-09 54 views
1

看看下面的MySQL查詢:MySQL的自聯接問題

SELECT fname,lname FROM users WHERE users.id IN (SELECT sub FROM friends WHERE friends.dom = 1) 

上述查詢首先通過內部查詢創建一個集中的所有friends.sub的,然後外部查詢選擇列表用戶標識包含在由內部查詢創建的集合內(即兩個集合的聯合)的用戶。

這工作正常。但是,如果你需要的內部設置爲不僅包括潛艇,其中DOM = 1,又哪裏分= 1,像這樣的延遲性肌肉痠痛: 外部查詢仍然和上面一樣,純粹的僞代碼:

(SELECT sub FROM friends WHERE friends.dom = 1) 
***AND*** 
(SELECT dom FROM friends WHERE friends.sub = 1) 

是它使用內部查詢可以做出這種功能?

任何幫助或援助,感謝你們;-D

非常感謝球員,我的頭痛已經不復存在了!

回答

1

試試這個:

SELECT u.fname, u.lname 
FROM users u 
INNER JOIN friends f 
    ON (u.id = f.sub AND f.dom = 1) 
    OR (u.id = f.dom AND f.sub = 1)
+0

不錯的工作傢伙!這是最優化的方法嗎? – 2010-10-09 15:36:02

+0

@ DJDonaL3000:是的,我相信。如果你打算有很多記錄,你應該確保'sub'和'dom'被正確地索引。您可以使用MySQL ['EXPLAIN'](http://dev.mysql.com/doc/refman/5.0/en/explain.html)命令查看查詢是否使用索引。 – 2010-10-09 15:37:57

+0

用戶和朋友在不同的表格時如何自我加入? – Xailor 2010-10-09 15:39:23

1

我不知道如果我理解正確的是什麼subdom代表,但它看起來像你可以使用一個在那裏UNION

SELECT fname, lname 
FROM users 
WHERE users.id IN 
     ( 
      SELECT sub FROM friends WHERE friends.dom = 1 
      UNION 
      SELECT dom FROM friends WHERE friends.sub = 1 
     ); 

測試用例:

CREATE TABLE users (id int, fname varchar(10), lname varchar(10)); 
CREATE TABLE friends (dom int, sub int); 

INSERT INTO users VALUES (1, 'Bob', 'Smith'); 
INSERT INTO users VALUES (2, 'Peter', 'Brown'); 
INSERT INTO users VALUES (3, 'Jack', 'Green'); 
INSERT INTO users VALUES (4, 'Kevin', 'Jackson'); 
INSERT INTO users VALUES (5, 'Steven', 'Black'); 

INSERT INTO friends VALUES (1, 2); 
INSERT INTO friends VALUES (1, 3); 
INSERT INTO friends VALUES (4, 1); 
INSERT INTO friends VALUES (3, 4); 
INSERT INTO friends VALUES (5, 2); 

結果:

+-------+---------+ 
| fname | lname | 
+-------+---------+ 
| Peter | Brown | 
| Jack | Green | 
| Kevin | Jackson | 
+-------+---------+ 
3 rows in set (0.00 sec) 

也就是說,@Alec's solution可能更有效率。

+0

doms和subs只是代表用戶ID。如果用戶1是用戶2的朋友dom = 1並且子= 2 – 2010-10-09 15:22:28

+0

好的工作... 10個10匹配的隊友; - D – 2010-10-09 15:33:41