2014-05-20 1 views
1

제목이 약간 어색하지만, 내가 성취하려는 것을 설명하기 위해 최선을 다할 것입니다.동일한 테이블의 레코드에 대한 MySQL 조인 유형

Users이라는 테이블과 Friends이라는 테이블이 있습니다.

Users 테이블의 추상적 인 구조는 다음 UserID이 친구 요청을 보낸 사용자의 ID입니다

+----+--------+----------+--------+ 
| ID | UserID | FriendID | Hidden | 
+----+--------+----------+--------+ 

:

+----+------+----------+----------+ 
| ID | Name | Username | Password | 
+----+------+----------+----------+ 

Friends 테이블과 같은 추상적 인 구조를 가지고 FriendID은 요청의 수신자입니다. 받는 사람이 요청을 숨기도록 선택한 경우 숨겨진 열의 값은 1입니다.

이 모든 것을 하나의 쿼리로 압축하려고합니다. 지금까지 LEFT JOIN 또는 RIGHT JOIN 중 하나를 사용하는 두 개의 별도의 쿼리가 있습니다. 친구가 수신하는 요청

SELECT 
    *, 
    CASE 
     WHEN C.ID IS Null THEN "Request Sent" 
     ELSE "Friends" 
    END AS Status 
FROM 
    (SELECT DISTINCT 
     A.ID, A.Name, E.Hidden 
    FROM 
     Users A 
    INNER JOIN 
     Friends E ON A.ID = E.UserID 
    WHERE 
     A.ID in (SELECT UserID 
        FROM Friends 
        WHERE FriendID = "1" AND Deleted='No')) C 
RIGHT JOIN 
    (SELECT DISTINCT 
     B.ID, B.Name, F.Hidden 
    FROM 
     Users B 
    INNER JOIN 
     Friends F ON B.ID = F.FriendID 
    WHERE 
     B.ID in (SELECT FriendID 
        FROM Friends 
        WHERE UserID = "1" AND Deleted = 'No')) D ON C.ID = D.ID 

에 관해서는 현재 친구 : 내가하지 않은 경우

SELECT *, CASE WHEN D.ID IS Null THEN "Wants to be your friend" ELSE "Friends" END AS Status FROM 
(SELECT DISTINCT 
A.ID, A.Name, E.Hidden 
FROM 
Users A INNER JOIN Friends E ON A.ID=E.UserID 
WHERE 
A.ID in (SELECT UserID FROM Friends WHERE FriendID = "1" AND Deleted='No')) C 
LEFT JOIN 
(SELECT DISTINCT 
B.ID, B.Name, F.Hidden 
FROM 
Users B INNER JOIN Friends F ON B.ID=F.FriendID 
WHERE 
B.ID in (SELECT FriendID FROM Friends WHERE UserID = "1" AND Deleted='No')) D 
ON C.ID=D.ID 

벤 다이어그램은 아래의 중요한 설명을 밀어 수 있습니다

전송 요청과 현재 친구를 찾으려면 내가 필요한 것을 설명했다.

Venn Diagram

내가 모든 열을 선택한 querie (들)을 건설하기위한 목적으로, 유의하시기 바랍니다,하지만 난 단지 끝 부분에있는 친구 이름과 ID 년대가 필요합니다.

답변

1

두 쿼리 사이에 union all 또는 union distinct을 입력하면 모든 결과가 하나의 테이블에 반환됩니다.

+0

두 사용자가 친구 인 경우 반복되는 행을 중지하려면 'UNION DISTINCT'로 'UNION ALL'을 변경 한 후 작동하는 것으로 보입니다. 도와 주셔서 감사합니다! –

+0

또 다른 추가 비트는이 질문에서 1 번만 사용자의 ID를 제공 할 수 있습니까? 그것은 단지 세션 테이블을 가지고 있기 때문에 내부 ID를 사용하여 세션 ID에서 사용자 ID를 얻습니다. 그래도 괜찮 으면! –

+0

당신은 이미 이것이 1인지 아닌지를 결정하는 사례 구조가 없습니까? – Hituptony