2011-07-03 34 views
1

我有一個表accounts(id,full_name)和account_friends(account_id,friend_id)。 friend_id基本上是另一個用戶的帳戶ID。我如何找到賬號id = 1的所有賬號尚未建立友誼?查找與用戶尚未交友的帳戶

回覆@OMG Ponies。

基本上,我明白這將需要多個連接。我的邏輯是這樣的:

SELECT 
    a2.id 
FROM 
    accounts a1 

/* left/right join a1 with account_friends */ 

INNER JOIN 
    accounts a2 
ON 
    af1.friend_id = a2.id 
WHERE 
    a1.id; 

雖然我不明白,左/右連接位應該做的伎倆找到不-朋友條目。

回答

0

這會給你所有的賬戶ID和名稱,其中ID是不佔ID = 1而不是帳戶ID的朋友= 1:

SELECT id, full_name 
    FROM accounts 
WHERE id NOT IN (SELECT friend_id 
        FROM account_friends 
        WHERE account_id = 1) 
    AND id <> 1 

正如在評論中提到antonis_wrx,這上面的查詢只有當一個賬戶的所有友誼存儲在賬戶 - >朋友(即(1,2))而不是混合物(即(1,2)和(3,1))時纔會成立。

下面是一個查詢,將第二種情況的工作:

SELECT id, full_name 
    FROM accounts 
WHERE id NOT IN (SELECT friend_id FROM account_friends WHERE account_id = 1) 
    AND id NOT IN (SELECT account_id FROM account_friends WHERE friend_id = 1) 
    AND id <> 1 
+0

但如果1是朋友2,是有可能,我們最終得到的(ACCOUNT_ID = 2,friend_id = 1),而不是( 1,2)? –

+0

@ant好的一點,我認爲友誼對每個用戶來說都是單向的並且是複製的,我會在不正確的情況下添加另一個查詢。 – staticbeast