2011-11-16 9 views
0

私は、ユーザーがお互いに音楽を推薦できるアプリケーションを構築しており、ユーザー自身とユーザーの両方が関わる推奨の「ストリーム」を返すクエリを構築するのに問題があります、およびユーザの任意の友人のいずれかを含むことができる。これは私のテーブル構造である:アクティビティストリーム/フィードのSQLクエリでの問題

勧告

ID  Sender  Recipient [other columns...] 
--  ------  --------- ------------------ 
r1  u1   u3   ... 
r2  u3   u2   ... 
r3  u4   u3   ... 

ユーザー

ID  Email  First Name Last Name  [other columns...] 
---  -----  ---------- ---------  ------------------ 
u1  ...  ...   ...   ... 
u2  ...  ...   ...   ... 
u3  ...  ...   ...   ... 
u4  ...  ...   ...   ... 

関係

ID  Sender  Recipient  Status  [other columns...] 
---  ------  ---------  --------  ------------------ 
rl1  u1   u2   accepted  ... 
rl2  u3   u1   accepted  ... 
rl3  u1   u4   accepted  ... 
rl4  u3   u2   accepted  ... 

ので( 'U1' は友人である)ユーザU4」の、 u4に関連する推奨事項の「ストリーム」を検索したいこのストリームには、送信者または受信者がu4であるすべての推奨事項と、送信者または受信者がu1(友人)であるすべての推奨事項が含まれます。

これは私がこれまでにクエリの持っているものです。私の知る限り(私はSQLの専門家だ)見ることができるように、動作しているようです

SELECT * FROM recommendations 
    WHERE recommendations.sender IN 
    (SELECT sender FROM relationships WHERE recipient='u4' AND status='accepted' 
     UNION 
     SELECT recipient FROM relationships WHERE sender='u4' AND status='accepted') 
OR recommendations.recipient IN 
    (SELECT sender FROM relationships WHERE recipient='u4' AND status='accepted' 
     UNION 
     SELECT recipient FROM relationships WHERE sender='u4' AND status='accepted') 
UNION 
SELECT * FROM recommendations 
WHERE recommendations.sender='u4' OR recommendations.recipient='u4' 
GROUP BY recommendations.id 
ORDER BY datecreated DESC 

。これは、特定のユーザーに関連する「Recommendations」テーブルのすべてのレコードを返します。しかし、私は現在、Usersテーブルからもデータを取得することに問題があります。 Recommendationsテーブルには送信者と受信者のID(外部キー)がありますが、それぞれの姓と名も取得したいと思います。私は何らかの種類のJOINが必要だと思うが、進め方が分からず、その助けを求めていた。 (また、現在のクエリで改善の余地が見られる場合は、私はすべて耳にします)

ありがとう!

答えて

0

私はそれを理解したと信じています。私はそれぞれから引っ張ることができるように、usersテーブルの2つのエイリアスを作成しなければならなかった。次のような作業クエリがあります。

SELECT recommendations.*, user1.firstname AS 'senderFirstName', user1.lastname AS 'senderLastName', user2.firstname AS 'recipientFirstName', user2.lastname AS 'recipientLastName' 
FROM (recommendations, users) 
INNER JOIN users AS user1 ON (user1.id=recommendations.sender) 
INNER JOIN users AS user2 ON (user2.id=recommendations.recipient) 
WHERE recommendations.sender IN (SELECT sender FROM relationships WHERE recipient='4' AND status='accepted' UNION SELECT recipient FROM relationships WHERE sender='4' AND status='accepted') OR recommendations.recipient IN (SELECT sender FROM relationships WHERE recipient='4' AND status='accepted' UNION SELECT recipient FROM relationships WHERE sender='4' AND status='accepted') 
UNION 
SELECT recommendations.*, user1.firstname AS 'senderFirstName', user1.lastname AS 'senderLastName', user2.firstname AS 'recipientFirstName', user2.lastname AS 'recipientLastName' 
FROM (recommendations, users) 
INNER JOIN users AS user1 ON (user1.id=recommendations.sender) 
INNER JOIN users AS user2 ON (user2.id=recommendations.recipient) 
WHERE recommendations.sender='4' OR recommendations.recipient='4' 
GROUP BY recommendations.id 
ORDER BY date created DESC 

誰かが改善の余地がある場合は、何かアドバイスをいただきありがとうございます。

+0

独自のサービスではなくサードパーティのサービスを使用することができる場合は、http://www.collabinate.comをこのような課題に簡単に対応できます。 – Mafuba

+0

誰もがこれを今に渡って来て - これまでこれまでにこれを行う。 – blabus

+0

ハハ...あなたは理由を説明するのに気をつけますか? – Mafuba