뭔가 상큼한 방법이 있지 않을가 싶어 질문 올려봅니다.
아래와 같은 데이터가 있습니다.
WITH TT(ID, F_ID, STATUS) AS(
SELECT 'AAA','BBB',2 FROM DUAL UNION ALL
SELECT 'AAA','CCC',2 FROM DUAL UNION ALL
SELECT 'DDD','AAA',2 FROM DUAL UNION ALL
SELECT 'BBB','CCC',2 FROM DUAL UNION ALL
SELECT 'DDD','CCC',2 FROM DUAL UNION ALL
SELECT 'DDD','GGG',0 FROM DUAL UNION ALL
SELECT 'DDD','FFF',2 FROM DUAL
)
ID를 기준으로 친구 신청한 F_ID가 있습니다.
신청하면 STATUS는 0이 되고, 거절하면 1이 되고 승락하면 2가 됩니다.
그래서 친구가 된 ID를 기준으로 함께 아는 친구가 많은 친구 아이디순으로 조회 하려 합니다.
내 아이디가 'AAA'라고 가정하고 아래처럼 결과가 나올 것으로 예상합니다.
ID CNT
CCC 2
BBB 1
DDD 1
FFF 1
나의 친구는 BBB, CCC, DDD 입니다.
그러므로 CCC는 BBB, DDD와 함께 친구로 2가 됩니다.
BBB는 CCC와 함께 친구로 1
DDD는 CCC와 함께 친구로 1
FFF는 DDD와 함께 친구로 1
감사합니다.
상큼하진 않지만
눈에 보이는대로 기술하였습니다;
상큼한 답변은 다음 분이..
SELECT ID, COUNT (1) cnt FROM (SELECT DECODE (a.ID, b.ID, b.f_id, b.ID) ID FROM (SELECT DISTINCT DECODE (ID, :ID, f_id, ID) ID FROM tt WHERE (ID = :ID OR f_id = :ID) AND status = '2') a , tt b WHERE ( a.ID = b.ID OR a.ID = b.f_id) AND b.status = '2' AND b.ID != :ID AND b.f_id != :ID) GROUP BY ID ORDER BY cnt DESC, ID
저는 이렇게 해봤는데..
상큼하지 않아서...
SELECT AA.ID, COUNT(*) CNT FROM ( SELECT ID, F_ID FROM TT WHERE STATUS = 2 UNION ALL SELECT F_ID ID, ID F_ID FROM TT WHERE STATUS = 2 ) AA , ( SELECT CASE WHEN ID = 'AAA' THEN F_ID WHEN F_ID = 'AAA' THEN ID END F_ID FROM TT WHERE STATUS = 2 AND (ID = 'AAA' OR F_ID = 'AAA') ) BB WHERE AA.F_ID = BB.F_ID AND AA.ID != 'AAA' GROUP BY ID ORDER BY CNT DESC, ID ;