2012-05-13 5 views
3

이 4 개 필드가 나는 등의 출력을에 원하는 서로MySQL의 관련 분야

Friends - posts - users - feeds

관련이 있습니다 , 어떤 부분에 참여해야하는지에 관한 문제가 있습니다. 친구 테이블, friend_id 또는 user_id의 모든 게시물과 현재 로그인 한 사용자의 게시물을 표시하고 싶습니다. 친구 테이블에서 일치하는 친구가없는 경우 사용자의 모든 게시물을 출력하면됩니다. 제발 당신 도움이 필요해주세요. 현재 사용자의

는 friends.friend_id = 친구

따라서 사용자

friends.user_id = 현재 친구 friends.friend_id = posts.user_id 또는 friends.user_id = posts.user_id

내 친구 테이블을 이해할 수없는 경우, 더 잘 만들 수 있도록 변경하십시오.

+0

달성하고자하는 것을 더 잘 설명하고 친구들이 사용자 및 게시물과 어떤 관계가 있는지 설명하십시오. – aleroot

+0

친구 테이블은 사용자 및 게시물과 관련됩니다. friends.friend_id = posts.user_id = users.user_id 게시물에서 모든 게시물 FF 조건을 사용하여 출력 할 : 일치하는 경우 friends.friends_id 또는 friends.user_id 일치) 2 posts.user_id 경우 1.) posts.user_id = 현재 로그인 한 사용자의 모든 게시물을 선택하기 만하면됩니다. –

+0

'피드 '는 다른 테이블과 어떻게 관련이 있습니까? '피드 '에서'당신'과'모두'를 구별하는 법? – vyegorov

답변

2

사용자 또는 친구로부터 게시물을보고 싶습니다. 따라서, 대신 사용자와 가입의 경우 다음과 같이 서브 쿼리와 조인

SELECT users.firstname, users.lastname, users.screenname, 
     posts.post_id, posts.user_id, posts.post, posts.upload_name, 
     posts.post_type, DATE_FORMAT(posts.date_posted, '%M %d, %Y %r') AS date, 
     COUNT(NULLIF(feeds.user_id, ?)) AS everybody, 
     SUM(feeds.user_id = ?) AS you, 
     GROUP_CONCAT(CASE WHEN NOT likes.user_id = ? THEN 
      CONCAT_WS(' ', likes.firstname, likes.lastname) END) as names 
    FROM (SELECT user_id FROM website.users WHERE user_id = ? 
     UNION ALL 
     SELECT user_id FROM website.friends WHERE friend_id = ? 
     UNION ALL 
     SELECT friend_id FROM website.friends WHERE user_id = ?) AS who 
    JOIN website.users users ON users.user_id = who.user_id 
    JOIN website.posts posts ON users.user_id = posts.user_id 
    LEFT JOIN website.feeds feeds ON posts.post_id = feeds.post_id 
    LEFT JOIN website.users likes ON feeds.user_id = likes.user_i) 
GROUP BY posts.pid 
ORDER BY posts.pid DESC; 

테스트 출력 here을.

+0

아직 뭔가 잘못 됐어.이 부분에서 생각해 보자. SELECT friend_id FROM website.friends friends.user_id =?'** 사용자가 친구이고 다른 사용자가 로그인 한 경우 사용자가 게시물을 볼 수 있습니까? 그 사용자의? ** - 당신의 코드를 테스트 할 때, friend_id와 user_id의 로직 부분 만 수정하는 것 같습니다. 만약 friend_id!= user_id는 사용자의 모든 게시물보다 그의 게시물에 대해서만 나타납니다. –

+0

내가 말하는 것은 예'A와 B '입니다. ** A **가 ** B **와 친구라면 ** A **는 이제 user_id이고 ** B **는 friend_id입니다. ** B **가 로그인되어 있으면 ** A **의 게시물을 볼 수 없습니다. –

+0

왜 안 되니? ** B **는 다른 세션을 사용할 것입니다. 아무런 문제가 없습니다. 이것은 아마도이 쿼리에 대해'user_id'를 어떻게 지정했는지 논리에 달려있을 것입니다. – vyegorov

2

내가 아니라 당신이 친구 = USER_ID를 기반으로 친구 테이블을 가입하려는 이해하면 친구 테이블의 USER_ID에 가입 일치, 그래서 당신은이 같은 뭔가를 시도 할 수없는 경우 :

SELECT users.firstname, users.lastname, users.screenname, posts.post_id, posts.user_id, 
posts.post, posts.upload_name, posts.post_type, 
DATE_FORMAT(posts.date_posted, '%M %d, %Y %r') AS date, 
COUNT(NULLIF(feeds.user_id, ?)) AS friends, SUM(feeds.user_id = ?) AS you, 
GROUP_CONCAT(CASE WHEN NOT likes.user_id = ? THEN 
      CONCAT_WS(' ', likes.firstname, likes.lastname) 
        END 
      ) as names 
FROM website.users users 
INNER JOIN website.posts posts ON (users.user_id = posts.user_id) 
LEFT JOIN website.feeds feeds ON (posts.post_id = feeds.post_id) 
LEFT JOIN website.users likes ON (feeds.user_id = likes.user_id) 
LEFT JOIN website.friends friends ON ((posts.user_id = friends.user_id) OR (posts.user_id = friends.friends_id)) 
GROUP BY posts.pid 
ORDER BY posts.pid DESC 

I 기본적으로 친구 테이블에 OR을 사용하여 JOIN을 추가하려는 두 필드에 JOIN을 추가했습니다 ...

+0

이 하나는 모든 사용자로부터 모든 게시물을 제공합니다 ... 분명히 말하고 싶습니다 :'friends.friend_id'는 ** friend **의 ID이고'friends.user_id'는 현재의 ID입니다 사용자. 따라서 사용자의 친구와 사용자의 모든 게시물이 출력됩니다. –