1

友達の友達と、そのユーザーとの相互友達の数を表示する機能を開発しようとしています。これまでのところ、私は機能を別々に行うことができましたが、一緒に行うことはできませんでした。

これが私が使用しているuserfriendsと呼ばれるメインビューです。ここで、user1は最初のユーザーで、user2は友達です。

ここに画像の説明を入力してください

これは、2人のユーザー間の相互の友達を見るために私が開発した機能です

SELECT id FROM users
WHERE id IN (
    SELECT user2 FROM userfriends WHERE user1 = me
) AND id IN (
    SELECT user2 FROM userfriends WHERE user1 = second
)

Usersは、userfriendsテーブルにあるユーザーIDをユーザーに関する情報にリンクできるメインテーブルです。Meとsecondは、1番目と2番目のユーザーの検索をエミュレートするストアドプロシージャの変数です。この関数は計画を立てるために機能します。

私が持っている2番目の機能は、私の友達とは友達であるが、私とは友達ではないすべてのユーザーを表示することです。

SELECT user2 AS id
FROM userfriends
    WHERE user1 IN (
        #Selects my friends
        SELECT user2 FROM userfriends
        WHERE user1 = me
    ) 
    AND user2 <> me #Makes sure is not me
    AND user2 NOT IN ( #Makes sure not already friend
        SELECT user2 FROM userfriends
        WHERE user1 = me
    )

繰り返しになりますが、計画に取り組んでいるすべての人と私はユーザーIDを表しています。これにより、すべての友達の友達のリストが返されます。

相互ユーザーのリストや友達の友達のリストの代わりに取得できるようにしたいのは次のとおりです。

友達の友達のユーザーIDと、私とそのユーザーが共有する相互の友達の数を含むテーブル。その他:user:1、friends_in_common:103。十分に明確でない場合は、質問してください。明確にするよう努めます。2つの関数はそれ自体でそれを行いますが、それをマージする方法がわかりません。

4

1 に答える 1

1
-- use a self-join of userfriend*userfriend
-- to find all the friends that moi&toi have in common
-- , and count them.
-- (optionally) suppress the rows for (toi<=moi)
-- , because there are basically the same as the corresponding rows with
-- (toi>moi)
-- -----------------------------------
SELECT DISTINCT 
   uf1.user1 AS moi
   , uf2.user1 AS toi
   , COUNT(*) AS cnt
   FROM userfriend uf1
   JOIN userfriend uf2 ON uf1.user2 = uf2.user2
   WHERE uf1.user1 < uf2.user1 -- Tie breaker, symmetry remover
   GROUP BY uf1.user1, uf2.user1
   ; 
于 2012-12-24T10:02:31.597 に答える