2012-04-27 4 views
2

私は次のシステムのtwitterタイプで作業しています。フォロワー表にいるユーザーの名字を取得するために、2つの表、ユーザー、フォロワーを結合しています。私はフォロワーテーブルの内部結合を実行して、フォロワーとフレンドの関係をキャプチャーします。私はフォロワー(あなたに従う)、フォロー(あなたがフォローしている)、および友人(相互フォロー)として結果を表示しています。twitter-style follower/follow/friend sqlクエリ

以下のクエリでは、友だちを見たいユーザーの名前しか表示できません。私は、ユーザーの名前ではなく、ユーザーの友人を見せたいですが、ユーザーテーブルに二重の義務を果たす方法を理解することはできません。つまり、ユーザーの名前と名前を表示してください彼らの友人、または単に友人の名前。

ありがとうございました。

SELECT users.id, users.firstname, users.lastname, followers.follower_user_id, followers.followee_user_id 
      FROM users 
      JOIN followers ON followers.follower_user_id = users.id 
      INNER JOIN followers ff ON followers.followee_user_id = ff.follower_user_id AND followers.follower_user_id = ff.followee_user_id 

答えて

7

私はあなたのスキーマが必要な情報を集めるために労働組合のテーブルが必要であることを信じています。これを複数のテーブルで行うほうが効率的かもしれません。ユーザからの(可能な)重複情報を有するフォロワの別個のテーブルを維持することも、望ましくない可能性がある。より効率的なスキーマは次のようになります。

mysql> select * from users; 
+-----+------------+---------+ 
| uid | fname  | lname | 
+-----+------------+---------+ 
| 1 | Phillip | Jackson | 
| 2 | Another | Name | 
| 3 | Some Crazy | User | 
| 4 | Nameless | Person | 
+-----+------------+---------+ 
4 rows in set (0.00 sec) 


mysql> select * from follows; 
+---------+-----------+ 
| user_id | follow_id | 
+---------+-----------+ 
|  1 |   4 | 
|  2 |   3 | 
|  3 |   2 | 
|  4 |   2 | 
+---------+-----------+ 
4 rows in set (0.00 sec) 

そしてあなたのクエリは次のようになります。

select users.uid, 
users.fname, 
users.lname, 
u.uid, 
u.fname, 
u.lname from users 
inner join follows f on (f.user_id=users.uid) 
inner join users u on (u.uid=f.follow_id) 

返す:

mysql> select users.uid, 
    -> users.fname, 
    -> users.lname, 
    -> u.uid, 
    -> u.fname, 
    -> u.lname from users 
    -> inner join follows f on (f.user_id=users.uid) 
    -> inner join users u on (u.uid=f.follow_id); 
+-----+------------+---------+-----+------------+--------+ 
| uid | fname  | lname | uid | fname  | lname | 
+-----+------------+---------+-----+------------+--------+ 
| 1 | Phillip | Jackson | 4 | Nameless | Person | 
| 4 | Nameless | Person | 2 | Another | Name | 
| 2 | Another | Name | 3 | Some Crazy | User | 
| 3 | Some Crazy | User | 2 | Another | Name | 
+-----+------------+---------+-----+------------+--------+ 
4 rows in set (0.00 sec) 
+0

この方法を使用すると、あなたをフォローするユーザーについての両方の情報を取得することは簡単ですが、フォローするかどうかは、引き分けますか。非常に効率的で、1つのクエリで実行できます。ただ再構築が必要です。 – philwinkle

+0

クイックスタートをご希望の場合は、こちらのペイジーのスキーマをご覧ください:http://pastebin.com/4UPwAYPX – philwinkle

+0

ありがとうございます。あなたが提案したテーブルの設定は、私の現在の設定のようなものです。私はこの新しいクエリを試してみるつもりですが、まもなく回答が返ってきます。 – chowwy

2
SELECT u.id, u.first_name, u.last_name, uf.id, uf.first_name, uf.last_name 
FROM users u 
JOIN followers f 
ON  f.follower_user_id = u.id 
JOIN followers ff 
ON  (ff.followee_user_id, ff.follower_user_id) = (f.follower_user_id, f.followee_user_id) 
JOIN users uf 
ON  uf.id = f.followee_user_id 
+0

をこのいただきありがとうございます。今それを試してみるつもりです。 – chowwy

+0

私はあなたの答えをupvoted;このクエリは友人の友人を識別するためにうまくいきました私は1つのクエリからフォロワーとフレンドを特定できるので、他の答えを選択しました。 – chowwy

+0

友人の友人ではなく、友人を特定するのがうまくいったということです。 – chowwy