2012-08-01 1 views
1

내가 반대 해결책을 찾고 있는데 this question. tableB를 tableB로 self-join하려고하는데, where 절은 tableB 결과에 영향을 미치지 않습니다. cancel_date = '0000-00-00'을 사용하여 모든 고객과 고객의 합계를 계산하고 싶습니다. 테이블 tableA와 tableB의 위치를 ​​전환하고 싶지 않습니다. 나는 다른 whereselect 진술을 기반으로 tableA.MySQL자가 제외와 함께 어디

SELECT 
count(tableA.client_id) as c_total, 
count(tableB.client_id) as all_c_total 
FROM (tableA) LEFT JOIN tableA tableB ON tableA.client_id = tableB.client_id 
WHERE tableA.`cancel_date` = '0000-00-00' 
GROUP BY month(tableA.purch_date) 
ORDER BY month(tableA.purch_date)  

결과이 같은 모습은해야

--------------------- 
c_total | all_c_total 
--------------------- 
    251 | 273 
    45 | 65 
    12 | 15 
    23 | 29  

답변

0

당신은 ... RIGHT JOIN을 사용하고, 조인 조건에 WHERE 절에서 조건을 이동할 수

SELECT 
    count(t1.client_id) as c_total, 
    count(t2.client_id) as all_c_total 
FROM tableA t1 
    RIGHT JOIN tableA t2 
     ON t1.client_id = t2.client_id 
     AND t1.`cancel_date` = '0000-00-00' 
GROUP BY month(t1.purch_date) 
ORDER BY month(t1.purch_date) 

하지만 ... 다시 생각해 보시고 테이블의 순서를 바꿔 LEFT JOIN을 사용하시기 바랍니다. LEFT JOINRIGHT JOIN보다 나은 스타일과 읽기 쉽습니다.

+0

내 select 및 where 문은 tableA를 기반으로하므로 tableB (all_c_total)의 한 추가 열로 인해 부적절한 스위치 테이블이 아래로 뒤집어 질 것이라고 생각했습니다. 그리고 당신의 대답은 작동하지 않았다. (cancel_date는 여전히 두 테이블 모두에 영향을 미친다.) – castt

+0

@castt Hmmm ... 별표 두 테이블에 대한 내 대답을 업데이트했다.'cancel_date'는't2'에 대한 결과를 제한해서는 안된다. if 업데이트 된 쿼리는 예상 결과를 제공하지 않으며, 다른 문제가있을 수 있습니다. 제공 한 예상 결과와 함께 이동하기 위해 샘플 데이터를 게시하는 것이 좋습니다. –

+0

@castt'tableA t1'의'where' 절에 조건이 없어야합니다. 그러면 '외부 조인'이 '내부 조인'으로 바뀝니다. 지금까지 'from' 절에서 테이블을 정렬하는 것과 같이, 어떤 테이블이'select' 문에서 가장 많은 열을 가지고 있는지를 결정할 필요가 없다고 생각합니다 ... 대신 주문은 어떤 것을 기반으로해야한다고 생각합니다 일종의 논리적 인 진행, 필요한 레코드 ('t2')로 시작하여 선택적 레코드 ('t1')로 진행합니다. –