2011-07-18 7 views
2

は、私は2つのテーブル相互フレンズSQLは(MySQLの)

ユーザーテーブルを持って参加します。すなわち:

user_relationships 
1 | 1 | 3 
2 | 2 | 3 

users 
3| sammy 

ユーザー1と2は共通の友人3を持っている私は1つのクエリで彼の名前「サミー」を取得したいです。

どうすればよいですか?異なるuser_idを持つ2つの行が同じfriend_id

すべての共通の友人があるようにあなたは、自分自身でuser_relationshipsに参加する必要があり

+1

をあなたが唯一の名前や '1を取得したいです| 1 | 3 |サミー? – Shef

+1

ユーザー名を持つすべてのユーザーのすべての相互の友人をリストしていますか?または他のユーザーの相互火事であり、名前を気にしない人をリストしますか?またはあなたはすでにuser1とuser2を持っていて、お友達の名前を共有したいのですか? – regilero

答えて

6
SELECT id, name 
FROM users 
WHERE id IN (
    SELECT friend_id 
    FROM user_relationships 
    WHERE user_id IN (1, 2) 
    GROUP BY friend_id 
    HAVING COUNT(friend_id) >= 2 
) 

または1つに参加して:

SELECT friend_id, name 
FROM user_relationships r 
    INNER JOIN users u ON r.friend_id = u.id 
WHERE user_id IN (1, 2) 
GROUP BY friend_id 
HAVING COUNT(friend_id) >= 2 
+0

素晴らしいこれは魅力のように働く – Fenec

6

select ur1.user_id user1, 
     ur2.user_id user2, 
     ur2.friend_id mutual_friend 
from user_relationships ur1 
     JOIN user_relationships ur2 ON ur1.friend_id = ur2.friend_id 
where ur1.user_id != ur2.user_id 

は、名前を取得するには、ユーザーテーブルに参加します

select ur1.user_id user_id1, 
     u1.name User1, 
     ur2.user_id user2, 
     u2.name User2, 
     ur2.friend_id mutual_friend_id, 
     u3.name mutual_friend 
from user_relationships ur1 
    JOIN user_relationships ur2 ON ur1.friend_id = ur2.friend_id 
    JOIN user u1 ON u1.user_id = ur1.user_id 
    JOIN user u2 ON u1.user_id = ur2.user_id 
    JOIN user u3 ON ur1.user_id = u3.user_id 
where ur1.user_id != ur2.user_id 

ur1.user_id = first_userとを使用して、特定のユーザーの友人をフィルタリングできます

0

あなたはこのような何かを試みることができる:

select id, name from users where id in 
    (select friend_id from user_relationships where user_id = @user1_id and friend_id in 
     (select friend_id from user_relationships where user_id = @user2_id) 
    ) 

このuser1_idと、@ user2_id @ IDを持つユーザーのすべての共通の友人を返す必要があります。 まだテストされていませんが、開始点を提供する必要があります。

0

このクエリでは、ID [no]の関連ユーザ名のリストが表示されます。 (USER_ID、friend_id)がすでに正当なプライマリキーであるよう

select u1.name, u2.name 
    from users as u1 
    join user_relationships as ur 
    on u1.id = ur.user_id 
    join users as u2 
    on ur.friend_id = u2.id 
    where U1.id = [no]; 

ところで、あなたは、あなたのクロステーブル用人工IDは必要ありません。