2010-11-22 2 views
6

useruserFriend이라는 2 개의 테이블이 있습니다. 사용자 테이블의 모든 사용자와 userFriend 테이블의 특정 멤버를 원합니다. 그럼 나는조건부 왼쪽 조인 작성 방법

userID userName userFriendID friendUserID  
2   bbb  1   2 
3   ccc  NULL  NULL 
4   ddd  3   4 
5   eee  NULL  NULL 

그래서 이런 식으로 내가 2 테이블에 대한 조건 싶은처럼

user 
userID userName 
1   aaa 
2   bbb 
3   ccc 
4   ddd 
5   eee 

userFriend 
userFriendID userID friendUserID 
1    1  2 
2    2  3 
3    1  4 
4    4  2 

가 그럼 내가 원하는 내 사용자 ID = 1이 될 경우 ... 둘 다 가입 할 userid = 1 인 두 번째 테이블 만 왼쪽 조인을 사용하여 첫 번째 테이블에 조인하려고합니다.

+0

코드를 좀 더 잘 레이아웃 할 수 있습니까? (서식 도움말 사용). 이 순간에는 userID, userFriendID 및 friendUserID가있는 것 같지만 두 ID 만 있으면됩니다. – Gidon

+0

데이터 모델을 올리시겠습니까? 나는 그러한 요청이 거기에 문제가 있음을 의미한다고 믿습니다. –

+0

체크 아웃 http://stackoverflow.com/questions/1255492/conditional-join-in-mysql – Singleton

답변

0

원하는 경우 두 테이블의 쿼리가 필요하지 않습니다. userFriend를 사용하면 데이터가 제공됩니다. 이름에 대해서만 user 테이블이 필요합니다.

SELECT DISTINCT userID FROM userFriend 
WHERE friendUserID = ? 

이렇게하면 필요한 특정 친구가있는 모든 사용자에게 제공됩니다. 은 선택적으로 당신은 INNER가 이름을 무엇을보고 가입 추가 할 수 있습니다

SELECT DISTINCT f.userID, u.name 
FROM userFriend f 
INNER JOIN users u ON u.userID = f.userID 
WHERE friendUserID = ? 

UPDATE 당신의 구조에 대한 주석. userFriendID는 필요하지 않습니다. 사용자 ID와 친구 ID의 조합이 귀하의 키가 될 수 있습니다. 이것은 당신에게 왼쪽 조인 친구 X에있는 모든 사용자를 반환합니다 쿼리

SELECT * FROM users u 
LEFT JOIN userFriend f on u.userID = f.userID 
WHERE f.friendUserID = ? 

UPDATE이 쿼리에서 중요하지 않습니다. 이 특정 조건으로 인해 관련성이 떨어집니다.

정확히 원하는 것을 얻기 위해서는 이것을 실행해야합니다.

SELECT * FROM users u 
LEFT JOIN (
    SELECT DISTINCT * FROM userFriend f 
    WHERE friendID = 4 
) x ON u.id = x.userId 

하위 쿼리를 사용하여 수행 할 수 있지만 테이블을 구성하는 가장 논리적 인 방법이라고 생각하지 않습니다.

4

요청하는 것이 비범 한 일이지만 ... 이것은 당신에게 당신이 원하는 결과를 제공합니다.

SELECT u.userID, u.userName, uf.userFriendID, uf.friendUserID 
FROM user u 
LEFT JOIN userFriend uf ON u.userID = uf.friendUserID AND uf.userID =1 
WHERE u.userID !=1