2014-01-16 2 views
0
table name : users u 
id username src 
1 mark  101 
2 stanley 102 
3 john  103 
4 stewe  104 


table name : call_history c 
id src  dst  duration 
1 101  555-1217 20  
2 555-1315 102  30 
3 555-2245 102  40 
4 102  555-6523 30 
5 102  555-4213 20 
6 555-1689 102  15 
7 103  555-1775 35 

두 개의 테이블과 이러한 열이 있습니다. 조건은 다음과 같습니다. 내가 이름 당함으로써 그룹으로 볼 필요가 무엇MySQL - 여러 조건 및 결과 GROUP BY

SUM(duration) AS OutboundSUM (Condition: u.src=c.src) 
COUNT(duration) AS OutboundCNT (Condition: u.src=c.src) 

SUM(duration) AS InboundSUM (Condition: u.src=c.dst) 
COUNT(duration) AS InboundCNT (Condition: u.src=c.dst) 

;

username OutboundSUM OutboundCNT InboundSUM InboundCNT 
mark  20   1   0   0 
stanley 50   2   85   3 
john  35   1   0   0 
stewe  0   0   0   0 

나는 선택하면, 모든 하위 쿼리를 UNION을, 내부 조인 시도했지만 작동하지 않았다. 연합 (Union)이 각 사용자 이름에 2 줄을 제공하고, 참여하면 나를 미쳤고 하위 쿼리는 오랜 시간이 걸리고 잘못된 결과가 표시됩니다.

모든 도움을 주실 수 있습니다.

문제는 Kicstart의 솔루션으로 해결되었습니다. 도움을 주셔서 대단히 감사합니다.

답변

0

테이블의 기본 키를 제공 할 수 있습니까? 그것은 우리가 더 나은 대답을하는 데 도움이 될 것입니다. 또한 join을 위해 u.src = c.src와 u.id = c.id 조건을 모두 포함해야합니다. 두 테이블의 ID가 서로 관련이없는 경우 다른 속성 이름을 사용하는 것이 좋습니다.

+0

기본 키는 동일하지만 관련이 없습니다. 연결 만 src fileds입니다. – Looden

+0

다른 속성 이름을 사용하십시오. DBMS를 혼동시킬 수 있습니다. –

0

몇 가지 하위 쿼리?

SELECT a.src, 
     oBSum AS OutboundSUM, 
     oBCnt AS OutboundCNT, 
     iBSum AS InboundSUM, 
     iBCnt AS InboundCNT 
FROM users u 
LEFT OUTER JOIN (SELECT src, SUM(duration) AS oBSum, COUNT(*) AS oBCnt FROM call_history GROUP BY src) ob 
ON u.src = ob.src 
LEFT OUTER JOIN (SELECT dst, SUM(duration) AS iBSum, COUNT(*) AS iBCnt FROM call_history GROUP BY dst) ib 
ON u.src = ib.dst 
+0

거의 변경하지 않고 시도해 보았습니다. 그랜드 쿼리의 GROUP BY u.username 끝을 추가했습니다. 그렇지 않으면 결과에 동일한 사용자 이름이 여러 번 나타납니다. 어쨌든 결과가 잘못되었습니다. – Looden

+0

두 번째 하위 쿼리에 오타가 있습니다 (열별로 잘못된 그룹). 수정하고 지금 올바른 결과를 제공해야합니다. 기본 쿼리에서 그룹을 사용할 필요는 없습니다. – Kickstart

+0

오우, 나는 그것을 놓쳤다, 감사합니다 킥 스타트, _o_ – Looden