2012-01-12 51 views
1

我在計算出需要製作的SQL語句時遇到了一些麻煩。MySQL - 複雜的查詢問題,多個表

我有2個表

朋友

=================================== 
friendfromid | friendtoid | request 
=================================== 

用戶

================= 
userid | username 
================= 

我需要那是我的朋友每個用戶的用戶名和用戶名。

我的id是在friendfromid或friendtoid中,具體取決於我是否被要求用戶或用戶請求我。

因此,基本上需要發生的是腳本需要查看好友表,獲取我的id是friendfromid或friendtoid的所有行,檢查請求字段是否設置爲1,獲取所有適合該行的行匹配,然後獲取不是我的每個friendfromid或friendtoid的ID和用戶名。

例如,如果我的身份證號碼是8,朋友身份證號碼是9,我們假設他們要求我的身份證號碼位於friendfromid字段,而我的身份證號碼位於friendtoid字段中,這意味着該腳本將採用他們的ID (9)並將其與用戶表中的該用戶相匹配。

回答

2

這會給好友列表與好友ID和朋友的名字:

SELECT u.userid , u.username 
FROM Friends f 
JOIN Users u 
ON ((f.friendfromid ={the ID} AND friendtoid=u.userid) 
OR (f.friendtoid = {the ID} AND friendfromid=u.userid)) 
WHERE f.request = 1 

認沽{標識} =用戶ID朋友目錄要求。

+0

我認爲你的意思是'(friendfromid =?和friendtoid = userid)或(friendtoid =?和friendfromid = userid) '。 – 2012-01-12 05:27:14

+0

是的。?意味着需要其朋友列表。 – 2012-01-12 05:31:45

+0

我的意思是當'fromid'匹配'toid'是外鍵,反之亦然。你的整個連接條件相當於'{ID} = userid'! – 2012-01-12 05:35:30

1

應該是這樣的:

SELECT * 
FROM users 
JOIN friends 
ON friendfromid != userid 
OR friendtoid != userid 
WHERE request = 1 
    AND userid = {the ID} 
+0

不正確的。他想從「friendfromid」或「friendtoid」中獲取ID,他的用戶ID位於相反的字段中。 – Raptor 2012-01-12 04:28:15

1

不能在1個查詢實現。

friendfromid領域得到friendtoid與 「我的用戶ID」:

SELECT b.friendtoid FROM Users a, Friends b WHERE request=1 AND friendfromid = a.userid 

反之爲friendfromid

+0

對不起,這沒有任何意義....我需要從用戶表中獲取用戶名和用戶名 – BigJobbies 2012-01-12 05:09:20

1

使用UNION查詢,爲加盟爲好友下面

SELECT username FROM user INNER JOIN friends ON (userid = friendfrom) WHERE friendto = {myid) AND request = 1 
UNION 
SELECT username FROM user INNER JOIN friends ON (userid = friendto) WHERE friendfrom = {myid} AND request = 1 

記住,你需要在friendto和friendfrom列的索引的性能