次のテーブルがあります。
members(id, name, surname, username, password)
friends(uid, friend_uid, confirmed_uid, confirmed_friend_uid)
friends テーブルでは、uid
とがfriend_uid
関係しています。members.id
ここで、uid
は常に より低くなりfriend_uid
ます。が友達になることに同意したfriends.confirmed
場合は true 、友情を確認した場合は trueです。friends.uid
friends.friend_confirmed
friends.friend_uid
ユーザー A は B と C のみのフレンドであり、両方ともフレンドシップを確認しています。B と C のリスト (すべての A の確認済みの友達) を A に表示するクエリが必要ですが、まだ A と友達ではないことを確認しています。
私のMySQLは非常に錆びているので、現在複数のクエリでこれを行っていますが、これは非常に非効率的である必要があり、Webサイトのパフォーマンスに影響を与える前にすべてのクエリを作成する必要があります.
私は MySQL のドキュメントを読み始めました。どこかで入手できたら更新しますが、誰かがプロセスをスピードアップするのを手伝ってくれるなら、大いに感謝します。
これが私が少し疑似コードでそれをやっている方法です:
member_id_for_A = 1;
friends_of_A = mysql_query("
SELECT m.*, f.* FROM friends f
inner join members m on m.id = f.uid
WHERE f.friend_uid = " + member_id_for_A + " AND confirmed_uid=1 AND confirmed_friend_uid=1
UNION
SELECT m.*, f.* FROM friends f
inner join members m on m.id = f.friend_uid
WHERE f.uid = " + member_id_for_A + " AND confirmed_uid=1 AND confirmed_friend_uid=1");
foreach(row : friends_of_A)
{
friend_id = get_friened_id(row, member_id_for_A);
friends_of_friend = get_friends(friend_id); // Performs a query like above friends_of_friend
result = remove_matches(friends_of_A, friends_of_friend); // Remove common friends
// Do something with results and move onto the next friend
}
これは非常に悪いコードであり、効率的ではないことはわかっていますが、MySQL をさらに学習する時間ができるまで、必要な機能を簡単に手に入れることができるハックな方法でした。1 つのクエリで、私が何を目指しているかを明確に把握できることを願っています。