2012-01-12 21 views
1

私は作成する必要があるSQL文を理解するのに少し問題があります。MySQL - 複雑なクエリの問題、複数のテーブル

私は2つのテーブル

友達

=================================== 
friendfromid | friendtoid | request 
=================================== 

ユーザー

================= 
userid | username 
================= 

私は私の友人で、各ユーザーのユーザーIDとユーザー名を取得する必要があります。

私のIDは、ユーザーまたはユーザーが私にリクエストしたかどうかによって、friendfromidまたはfriendtoidのいずれかにあります。

基本的に何が起こる必要があるのは、スクリプトがフレンドテーブルを見て、自分のidがfriendfromidかfriendtoidのすべての行を取得する必要があり、リクエストフィールドが1に設定されていることを確認し、マッチしてから、私のものではない、それぞれの友人のIDまたは友人のIDとユーザー名を取得します。

たとえば、自分のIDが8で、友だちのIDが9の場合、自分のIDがfriendfromidフィールドにあると私にリクエストしたとしましょう。私のIDはfriendtoidフィールドにあります。 (9)、それをusersテーブルのそのユーザに一致させます。

SELECT * 
FROM users 
JOIN friends 
ON friendfromid != userid 
OR friendtoid != userid 
WHERE request = 1 
    AND userid = {the ID} 

答えて

2

これは、友人の友人のIDや友人の名前のリストを提供します:

SELECT u.userid , u.username 
FROM Friends f 
JOIN Users u 
ON ((f.friendfromid ={the ID} AND friendtoid=u.userid) 
OR (f.friendtoid = {the ID} AND friendfromid=u.userid)) 
WHERE f.request = 1 

入れ{ID} =フレンドリストに必要なユーザーIDを。

+0

あなたは '(friendfromid =?AND friendtoid = userid)OR(friendtoid =?AND friendfromid = userid) '。 –

+0

はい。?友人リストが必要なことを意味します。 –

+0

私が意味するのは、 'fromid'が' toid'と外来キーが一致し、その逆の場合です。あなたの全参加条件は '{the ID} = userid'と同等です! –

1

は次のようなものであるべき。 friendfromidため

SELECT b.friendtoid FROM Users a, Friends b WHERE request=1 AND friendfromid = a.userid 

その逆:friendfromidフィールドに "私のユーザーID" とfriendtoidを取得するには

+0

正しくありません。彼は、自分のユーザIDが反対のフィールドにある「friendfromid」または「friendtoid」からIDを取得したいとします。 – Raptor

1

は1つのクエリで達成することはできません:

+0

申し訳ありませんが、これは意味がありません....私はユーザーテーブルからユーザーIDとユーザー名を取得する必要があります – BigJobbies

1

あなたは、パフォーマンスのためにfriendtoとfriendfrom列に対するインデックスを必要と覚えておいてください

SELECT username FROM user INNER JOIN friends ON (userid = friendfrom) WHERE friendto = {myid) AND request = 1 
UNION 
SELECT username FROM user INNER JOIN friends ON (userid = friendto) WHERE friendfrom = {myid} AND request = 1 

以下のように友達に入社、UNIONクエリを使用し