0

3 つの異なるテーブルにクエリを実行したいと考えています。 ここに画像の説明を入力

私のアプローチは、 FRIENDS TABLEから友達を取得することです。したがって、出力は次のようになります。 ここに画像の説明を入力

私はこの解決策を試してみました

SELECT users.firstname, users.lastname, 
users.screenname, profile.profile_pic, friends.friend_id
FROM website.users users
INNER JOIN website.friends friends ON (users.user_id = friends.friend_id)
LEFT  JOIN profile ON (friends.friend_id = profile.user_id)
WHERE (friends.user_id = "12052822" or friends.friend_id = "12052822")

問題は、1 つのレコードに一致すると、列"friend.user_id"が出力されることです。それは私がやりたいことではありません!ユーザーがログインしている場合、クエリは彼のすべての友人を取得します...どうすればそれをより簡単でより良い方法で行うことができますか?

4

1 に答える 1

1

表のidとのuser_id列はusers、少なくとも紛らわしいですか? なぜ 2 つの「識別子」列があるのですか? 2 つのうちのどれが と結合しfriend.user_idますか? と結合するのは同じ列friend.friend_idですか? 目的は、friends.user_idログインしたばかりのユーザーであるすべての名前、またはログインしたばかりのユーザーであるすべての名前friends.friend_id、またはその両方を表示することですか?

さらなる明確化が予定されているまでは、結果セットには両方の友達のリストが含まれていると想定します。つまり、ユーザーが友達になった人と、ユーザーを友達にした人です。users.user_idまた、列が結合列であると仮定します。

これは UNION として簡単に記述できます。UNION は、ログインしたユーザーが、ログインしたユーザーと友達になったユーザーと友達になった場合に、重複するエントリを削除することに注意してください (したがって、friends表には、と の同じ値user_idのペアfriend_id

TDQD (Test Driven Query Design) に移行すると、次のように記述できます (新しくログインしたユーザーが であると仮定user_id = 12052822):

ユーザー 12052822 が友達になったユーザー

SELECT u.user_id, u.firstname, u.lastname, u.screenname, p.profile_pic
  FROM website.friends AS f
  JOIN website.users   AS u ON f.friend_id = u.user_id
  JOIN website.profile AS p ON p.user_id   = u.user_id
 WHERE f.user_id = 12052822;

ユーザー12052822を友達にしたユーザー

SELECT u.user_id, u.firstname, u.lastname, u.screenname, p.profile_pic
  FROM website.friends AS f
  JOIN website.users   AS u ON f.user_id = u.user_id
  JOIN website.profile AS p ON p.user_id = u.user_id
 WHERE f.friend_id = 12052822;

両方のユーザー セット

SELECT u.user_id, u.firstname, u.lastname, u.screenname, p.profile_pic
  FROM website.friends AS f
  JOIN website.users   AS u ON f.friend_id = u.user_id
  JOIN website.profile AS p ON p.user_id   = u.user_id
 WHERE f.user_id = 12052822;
UNION
SELECT u.user_id, u.firstname, u.lastname, u.screenname, p.profile_pic
  FROM website.friends AS f
  JOIN website.users   AS u ON f.user_id = u.user_id
  JOIN website.profile AS p ON p.user_id = u.user_id
 WHERE f.friend_id = 12052822;

各コンポーネント クエリを個別にテストおよびデバッグし、それらを組み合わせて最終的な回答を作成できます。

于 2012-05-28T04:34:46.090 に答える