2011-09-09 3 views
0

私は、各ユーザのuser_idの主キーを持つusersというデータベーステーブルを持っています。mysqlクエリは、ソーシャルネットワーキングサイトでお互いの友達を見つけるのに役立ちます

また、user_idとfriend_user_idという2つのフィールドを持つfriendsというテーブルがあります。

重複したエントリを避けるために、user_idフィールドは常に2つのuser_idのうち最も小さいものです。

私は2人のユーザーを念頭に置いています(ユーザーID 1とユーザーID 4は何でも構いませんが)。

ユーザー1とユーザー4の友だち(つまり相互の友人)であるユーザーのユーザーテーブルからすべての行を返すにはどうすればよいですか。

答えて

6

私はあなたのレシピを与える:

  1. ユーザー1
  2. のすべての友人がユーザー2
  3. のすべての友人がそれらを交差し、結果は共通の友人になります探します。

    enter image description here

    UPDATE:多くのこのような

ここでは、クエリです:

select f.friend_user_id from friends f where f.friend_user_id in (
    select friend_user_id from friends where user_id=<id_of_user_a>) 
and f.user_id=<id_of_user_b> 

上記のクエリによって返されたIDがあるすべてのユーザーのIDになりますuser_aとuser_bの相互の友人。これらのユーザーに関するすべての詳細(名前など)を取得する場合は、次のようにします。

select f.friend_user_id,u.* from friends f inner join users u 
    on u.user_id=f.friend_user_id 
    where f.friend_user_id in (
    select friend_user_id from friends where user_id=<id_of_user_a>) 
    and f.user_id=<id_of_user_b> 
+0

ハハイカルス - 非常に良い。 – Chris

+0

さて、SQL文法は苦労していますが、入力に感謝しています – geoffs3310

+0

@ geoffs3310それはちょっとしたジョークです;)Chrisの答えを見てください。 (より簡潔に書くことができますが、彼がそこに置いた内部結合の必要はありません) – Icarus

0
SELECT friends.friend_user_id FROM user, friends 
INNER JOIN friends ON friends.user_id = user.user_id 
WHERE user.user_id = 1 
    AND friend.friend_user_id 
      IN (SELECT friends.friend_user_id 
      FROM user, friends 
      INNER JOIN friends ON friends.user_id = user.user_id 
      WHERE user_id = 4) 
関連する問題