0
SELECT
    FRIEND.friend_two AS possible_friend, USERS.username AS possible_username
FROM
    user_friends FRIEND, users USERS
WHERE 
    FRIEND.friend_one IN (SELECT friend_two FROM user_friends WHERE friend_one = :id)
    AND FRIEND.friend_two NOT IN (SELECT friend_two FROM user_friends WHERE friend_one = :id)
    AND NOT FRIEND.friend_two = :id
GROUP BY possible_friend

ユーザー

+------------+------------------+
|     id     |     username     |
+------------+------------------+
|     10     |       Josh       |
+------------+------------------+
|     20     |     Steward      |
+------------+------------------+
|     30     |      Fenton      | 
+------------+------------------+

user_friends

+------------+------------+------------+------------+
| friend_id  | friend_one | friend_two |    Role    |
+------------+------------+------------+------------+
| ramdom_id  |     10     |     10     |     me     +
+------------+------------+------------+------------+
| ramdom_id  |     20     |     20     |     me     +
+------------+------------+------------+------------+
| ramdom_id  |     10     |     20     |   friend   +
+------------+------------+------------+------------+
| ramdom_id  |     20     |     30     |   friend   +
+------------+------------+------------+------------+

friend_one = 10 (Josh)      -> follows -> friend_two = 20 (Steward)
friend_one = 20 (Steward)   -> follows -> friend_two = 30 (Fenton)

var_dump($クエリ); 次のテキストを表示します。

Array ( [possible_friend] => 30 [possible_username] => STEWARD )

var_dump のエラーは、私が既に Steward をフォローしており、Steward の ID が (20) であることです。私が示したいのは、

Array ( [possible_friend] => 30 [possible_username] => FENTON )

Fenton には の ID が(30)あり、Josh(10)ログインしているユーザーは Fenton をフォローしていません。

Josh(10)がログインしている場合は、フォローしていないのにフォローしているためJOSH、フォローすることを提案します。Fenton(30)Steward(20)Fenton(30)Josh(10)

このクエリが終了すると、その目的は、上記で説明したように、ユーザーがフォローするように友人の友人を提案することです。

FENTON の var_dump で説明したように、GROUP BY を使用して、提案されているユーザーに正しいユーザー名が出力されていることを確認するにはどうすればよいですか。現時点では、クエリの「AS possible_friends」ではなく、既にフォローしているユーザーのランダムなユーザー名を取得しています。


4

2 に答える 2

0

検討できる別のアプローチを次に示します。

SELECT FRIEND_NAME.username, P_FRIEND_NAME.username
FROM user_friends FRIENDS 
INNER JOIN user_friends P_FRIENDS on FRIENDS.friend_one = P_FRIENDS.friend_two
INNER JOIN users FRIEND_NAME on FRIENDS.friend_two = FRIEND_NAME.id
INNER JOIN users P_FRIEND_NAME on P_FRIENDS.friend_one = P_FRIEND_NAME.id
WHERE FRIENDS.friend_one <> P_FRIENDS.friend_one
and FRIENDS.friend_two <> P_FRIENDS.friend_two

結果: フェントン | ジョシュ

于 2013-09-10T03:58:29.263 に答える