2014-10-29 1 views
1

나는 MySQL 데이터베이스에 두 개의 테이블을 가지고있다. 테이블 c_origc_now 이런 cluster 번호에 person_id을,지도 :OUTER JOIN 이에 상응하는 MySQL

person_id cluster 
    0   0 
    1   0 
    2   1 
    ...   ... 

내가 지금 많은 사람들이 클러스터를 변경하는 방법을 알고 싶어요 (그들이에서 온 또는 어디가 어디로 갔는지) c_origc_now을 비교할 때. 다음 두 가지 쿼리를 통해 유입 및 유출을 선택할 수 있습니다. 이러한 쿼리의

SET @CLUSTER = 0; 

SELECT c_orig.cluster, COUNT(c_now.person_id) AS influx 
FROM c_now 
LEFT JOIN c_orig ON c_orig.person_id = c_now.person_id 
WHERE c_now.cluster = @CLUSTER 
AND (c_orig.cluster != @CLUSTER OR c_orig.cluster IS NULL) 
GROUP BY c_orig.cluster; 

SELECT c_now.cluster, COUNT(c_now.person_id) AS outflux 
FROM c_now 
LEFT JOIN c_orig ON c_orig.person_id = c_now.person_id 
WHERE c_orig.cluster = @CLUSTER 
AND c_now.cluster != @CLUSTER 
GROUP BY c_now.cluster; 

결과 : 해당 클러스터가 쿼리에 존재하지 않을 때

cluster influx 
    NULL  39 
    1  8 
    2  5 
    3  2 
    4  16 
    6  9 
    7  2 
    8  1 

cluster outflux 
    1  9 
    2  7 
    3  46 
    4  5 
    6  13 
    7  2 
    8  1 
    9  5 

은 지금은 이러한 쿼리를 결합, 및 0의 유입/outflux을 갖고 싶어. 그러나 나는 OUTER JOIN을 할 수없고 다른 순서를 가진 두 개의 LEFT JOIN은 너무 성가시다. 나는 그것을 성취하기위한 쉬운 길을 간과하고있는 것 같다. 누구든지 나를 도울 수 있습니까? 원하는 출력 :

cluster influx outflux 
    NULL  39   0 
    1  8   9 
    2  5   7 
    3  2  46 
    4  16   5 
    6  9  13 
    7  2   2 
    8  1   1 
    9  0   5 

답변

2

left join을 사용할 수 있지만 전체 클러스터 목록이 필요합니다. 쿼리의 전체 구조를 볼 수 있도록 내가 쿼리의 세부 사항을 떠납니다

select c.cluster, coalesce(q1.influx, 0) as influx, coalesce(q2.outflux, 0) as outflux 
from (select cluster from c_now union 
     select cluster from c_orig 
    ) c left join 
    (query1) q1 left join 
    on c.cluster = q1.cluster 
    (query2) 
    on c.cluster = q2.cluster; 

:

(select cluster from c_now union 
select cluster from c_orig 
) c 

당신은 귀하의 쿼리를 생성합니다 : 귀하의 질의을 감안할 때, 당신은 그것을 얻을 수 있습니다 . query1query2으로 검색어를 대체하십시오.

+0

출력에서'NULL' 값을 얻기 위해 첫 번째 LEFT JOIN을'RIGHT JOIN'으로 변경해야했지만 작동합니다. 감사! :-) – physicalattraction

+0

두 번째 생각 : 내 실제 예제에서만 효과가 있었다고 생각합니다. 왜냐하면 outflux에서만 행이없고 유입되는 행이 없기 때문이며, 현재 쿼리에서는 결과 행에 해당 행이 있습니까? – physicalattraction

+0

@physicalattraction. . . 예. 'c' 하위 쿼리에 있기 때문에 두 테이블의 모든 클러스터가 출력됩니다. –