제목이 약간 어색하지만, 내가 성취하려는 것을 설명하기 위해 최선을 다할 것입니다.동일한 테이블의 레코드에 대한 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
벤 다이어그램은 아래의 중요한 설명을 밀어 수 있습니다
전송 요청과 현재 친구를 찾으려면 내가 필요한 것을 설명했다.
두 사용자가 친구 인 경우 반복되는 행을 중지하려면 'UNION DISTINCT'로 'UNION ALL'을 변경 한 후 작동하는 것으로 보입니다. 도와 주셔서 감사합니다! –
또 다른 추가 비트는이 질문에서 1 번만 사용자의 ID를 제공 할 수 있습니까? 그것은 단지 세션 테이블을 가지고 있기 때문에 내부 ID를 사용하여 세션 ID에서 사용자 ID를 얻습니다. 그래도 괜찮 으면! –
당신은 이미 이것이 1인지 아닌지를 결정하는 사례 구조가 없습니까? – Hituptony