2011-11-16 4 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 (친구) 인 모든 권장 사항이 포함됩니다.

이것은 내가 지금까지 쿼리에 대해 무엇을 가지고 :

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 

내가 볼 수있는 (I 더 SQL 전문가는 아니지만)까지, 작동하는 것 같다 어느. 주어진 사용자에게 '관련성이있을 것'인 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