2011-02-06 5 views
2

안녕하세요, IM이 어떻게 상호적인 친구를 사귈 수 있는지 알아 내려고합니다.상호 친구 목록을 얻는 방법

메신저 현재이 문제를 생각하는 데 문제가 있습니다.

내가 "사용자"라는 테이블이 있고이 그것이 내가 테이블이 "우정" 불렀다

id | name 
----------- 
1 Kenny 
2 Jack 
3 Jimmy 
4 Chris 
5 Meg 
6 Jake 
7 Micheal 
8 Dude 

을 보는 방법과이는 모습입니다

user_a | user_b 
---------------- 
4   1   
7   5 
8   1 
2   4 
2   1 
5   2 
1   6 
1   7 

user_a는 user_b를 전송 친구가되고 싶다는 요청 ... BAM 친구가 있습니다. 이제 인스턴트 메신저 사용자 2, 그리고 사용자 1 친구 목록으로 이동하면, 나는 우리가 공통적으로 가지고있는 친구를보고 싶습니다. 그게 올바른 SQL은 무엇입니까?

답변

2

사용자 1이 사용자 7과 두 번 친구가 될 수 없다고 가정하면 (즉, 행이 user_a = 1, user_b=7이고 다른 행이 user_a = 7, user_b = 1 일 수 없음을 의미).

SELECT IF(user_a = 1 OR user_a = 2, user_b, user_a) friend 
FROM friendship 
WHERE (user_a = 1 OR user_a = 2) OR (user_b = 1 OR user_b = 2) 
GROUP BY 1 
HAVING COUNT(*) > 1 
+0

재미있는 점입니다. 사용자 1이 사용자 7과 친구가되는 것은 불가능하다고 가정합니다. 실제로 백엔드에서 해당 제한을 적용 할 수 있을지는 의문입니다. 아마도 user_a와 user_b를 합성 고유 키로 만드는 것이 최선의 방법 일 수 있습니다. 이 질문은 관련 질문이기 때문에 가능한 경우 누군가가 더 나은 해결책을 제안 할 수 있다면 좋을 것입니다. – user183037

+0

남자, 정말 고마워요! – Kenny

+0

@ user183037 이전과 같은 프로젝트를 만들었고, 내가 한 것은'user_a, user_b'에 기본 키를 만들고 친구 관계에 2 행 (둘 모두 조합)을 삽입하는 것이 었습니다. (user_a = @ user' 만 검색하면) 사용자의 친구를 검색하기 쉽고'user_b '에만 두 번째 색인이 필요하지 않습니다. –

관련 문제