4

ツイッタータイプの以下のシステムに取り組んでいます。ユーザーとフォロワーの2つのテーブルを結合して、フォロワーテーブルにあるユーザーの姓名を取得します。次に、フォロワーと友達の関係をキャプチャするために、フォロワーテーブルで内部結合を実行しています。結果は、フォロワー(あなたをフォローしている人)、フォローしている人(あなたがフォローしている人)、友達(相互フォローしている人)として表示しています。

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

ありがとう。

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
4

2 に答える 2

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)
于 2012-04-27T21:08:00.087 に答える
3
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
于 2012-04-27T20:54:59.413 に答える