2011-07-03 12 views
1

私はテーブルaccounts(id、full_name)とaccount_friends(account_id、friend_id)を持っています。 friend_idは基本的に別のユーザーのアカウントIDです。 account id = 1のユーザーがまだ友だちになっていないアカウントをすべて見つけるにはどうすればよいですか?ユーザーがまだ友だちになっていない「accounts」を見つけた

@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; 

/右ではない、友人のエントリを見つけるのトリックを行う必要がありますビットへの参加:私のロジックは次のようになります。この上記のクエリをコメントで述べたantonis_wrxよう

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

答えて

0

これは、あなたのIDは、ID = 1、ない= 1アカウントIDの友人を考慮されていないすべてのアカウントIDと名前を与えますアカウントのすべての友人関係がアカウント - >友人(すなわち(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

関連する問題