2012-03-05 18 views
0

私は、userIDとfriendID(別のユーザ)をリンクして、彼らが友達だと言うテーブルを持っています。ユーザ1が彼らの友人のようなユーザ24を追加した場合、ユーザ10は彼らの友人等のユーザ1を加算する場合 、以下の表の最初の行は、以下の表の2行目があっても、そこからMySQLテーブルの結合

が起こる が起こるユーザー1は両側にあり、隣接IDの友人です。

FRIENDS TABLE: 

userID | friendID 
----------------- 
    1 | 24 
    10 | 1 

私が今必要とするのは、ユーザー1がログインしている場合、友達であるユーザーを表示する必要があります。私が書いてきたこのクエリは:

SELECT DISTINCT (Users.username), friends.userID, friends.friendID FROM Users, friends WHERE Users.userID IN(SELECT userID FROM friends WHERE Users.userID = friends.userID) OR Users.userID IN(SELECT DISTINCT(userID) FROM friends WHERE Users.userID = friends.friendID) 

取り戻すだろう:

username | userID | friendID 
----------------------------- 
    name1 | 10 | 1 
    name1 | 1 | 24 
    name2 | 10 | 1 
    name2 | 1 | 24 

NAME1 = ID 1 NAME2 = ID 10

は、私はユーザーのログイン取得できる方法はありますuserIDまたはfriendID列に表示されているかどうか(たとえば、ID#1がログインしている場合)この場合、ID#1とリンクされているのでID 24とID 10を検索し、表示にはID#1をリストから削除します。

これは意味があり、あらかじめありがとうと思います!

答えて

1

これはUNIONで簡単に実行できます。また、これは重複の面倒を見る:

(SELECT userID 
FROM friends 
WHERE friendID = 1) 
UNION 
(SELECT friendID 
FROM friends 
WHERE userID = 1) 

あなたもユーザ名を返すようにしたい場合は、あなたは、サブクエリ内でJOINを行うことができます。

(SELECT f.userID, u.username 
FROM friends f 
JOIN users u 
    ON u.userID = f.userID 
WHERE f.friendID = 1) 
UNION 
(SELECT f.friendID, u.username 
FROM friends f 
JOIN users u 
    ON u.userID = f.friendID 
WHERE f.userID = 1) 
+0

id'からは、まだ可能性が高いので、SELECT DISTINCTでそれをラップすることになるでしょう重複することはありません。 – Brad

+0

@ブラッド、コメントのおかげで、UNIONは自動的に重複する行を削除します。 –

+0

ああ、私はそれを実現したことはありません!情報ありがとう – Brad

2
SELECT DISTINCT s.FriendId 
FROM (
    SELECT f.FriendId 
    FROM Friends f 
    WHERE f.UserId = @id 
    UNION ALL 
    SELECT f.UserId 
    FROM Friends f 
    WHERE f.FriendId = @id 
) s 
WHERE s.FriendId != @id 

ユーザーが自分自身を友人として追加していない可能性がある場合は、最後のWHEREは必要ありません。

+0

おそらくあなたのような何かを行うことができます。 ' f.UserId = @id UNION F友達FROM(SELECT f.FriendId は異なるs.FriendId、u.Username をSELECT ALL SELECT f.UserId を Fフレンズf.FriendId = @id )■ JOINのユーザ名U ON u.Id = s.FriendId s.FriendId!= @ – Daan

2

あなたがデータを格納する方法が効率的に見えるかもしれませんがが、次の方が良いアプローチかもしれません。 MUTUALの友情が形成されたら、userID(1)friendID(24)とuserID(24)friendID(1)の2回データを2回入力します。このアプローチが良いかもしれない理由は、あなたのテーブルを再利用可能にするからです。

現在、あなたのテーブルはFacebookのようなものです:私があなたの友人なら、あなたもまた私の友人です。私はあなたの活動を見ます。あなたは私の活動を見る。私が説明したデザインは、FacebookとTwitterの両方としてテーブルを使用できるようにします。自分のアクティビティに従っているからといって、私があなたに従いたいとは限りません。