2014-04-06 1 views
0

다음과 같은 테이블이 있습니다.하나의 테이블에 결과를 얻기위한 자체 조인 쿼리

+------+----------+--------+ 
| id |sender_id |receiver_id| 
+------+----------+--------+ 
| 1 | 1  | 4  | 
| 2 | 1  | 34  | 
| 3 | 4  | 1  | 
| 4 | 11  | 8  | 
| 5 | 24  | 4  | 
| 6 | 11  | 5  | 
+------+----------+--------+ 

다음과 같은 결과를보고 싶습니다.

+------+----------+--------+ 
|user_id|sent  |receive | 
+------+----------+--------+ 
| 1 | 2  | 1  | 
| 4 | 1  | 2  | 
| 5 | 0  | 1  | 
| 8 | 0  | 1  | 
| 11 | 2  | 0  | 
| 24 | 1  | 0  | 
| 34 | 0  | 1  | 
+------+----------+--------+ 

내가 보낸 USER_ID로 열 USER_ID (모든 고유 SENDER_ID & receiver_id)로, 한 테이블에 내 결과를 표시 할받는 등 (전송으로 수 (SENDER_ID), (receiver_id)를 계산). 그래서 모든 사용자가 보낸 하나의 테이블에 결과를 얻을 수 있습니다 & 메시지 번호를받습니다. 자체 조인 쿼리를 시도했지만 예상 한 결과를 얻지 못했습니다.

+1

계속하십시오. 뭔가 해봐. – Strawberry

+0

'GROUP BY'와'COUNT'을 살펴 보자. – Aiias

+0

@Strawberry 우리가 말할 때마다 10 명 밖에 없다면 Jon Skeet보다 더 많은 rep를 가질 수있다. – Kermit

답변

0

나는이 쿼리를 사용합니다 :

SELECT user_id, SUM(sent), SUM(receive) 
FROM (
    SELECT sender_id AS user_id, COUNT(*) AS sent, 0 AS receive 
    FROM tablename 
    GROUP BY sender_id 
    UNION ALL  
    SELECT receiver_id AS user_id, 0 AS sent, COUNT(*) AS receive 
    FROM tablename 
    GROUP BY receiver_id 
) s 
GROUP BY user_id 

here 바이올린을 참조하십시오. JOIN에 테이블이 될 것

SELECT user_id, 
     (SELECT COUNT(*) FROM messages WHERE sender_id = u.user_id) sent, 
     (SELECT COUNT(*) FROM messages WHERE receiver_id = u.user_id) received 
FROM users u 

또 다른 방법과 집계 중에 계산을 수행

+0

감사합니다. 저에게 도움이되었습니다. –

0

당신이 사용자의 테이블이 있다고 가정하면, 한 (비효율적하지만, 간결) 방법은 상관 하위 쿼리를 사용하는 것입니다 :

012 :

SELECT u.user_id, 
     SUM(m.sender_id = u.user_id) sent, 
     SUM(m.receiver_id = u.user_id) received 
FROM  users u JOIN messages m ON u.user_id IN (m.sender_id, m.receiver_id) 
GROUP BY u.user_id 

세 번째 (그리고 아마도 가장 효율적인) 방법은 먼저 테이블 두 가지 방법을 집계 한 후 결과를 결합하는 것

큰 데이터 세트에서 자주 수행 할 것으로 예상되는 작업 인 경우 users 테이블에서 사용자 당 보내거나받은 메시지 수를 캐시하는 것을 고려할 수 있습니다 (새 메시지가 보낸).