2012-04-19 1 views
1

조건부 사례 또는 If를 사용하여이를 수행하는 방법이있는 것처럼 느껴지지만 그 사실을 파악할 수 없습니다.왼쪽 조인에서 행을 반환하는 경우 조건부 Where 절?

아래의 쿼리는 세 개의 테이블을 결합하여 세 개의 테이블이 모두 행을 반환 할 때 유용합니다. 그러나 campaign_groups 및 new_advertisers에는 레코드가 있지만 payment_transactions에는 레코드가없는 경우가 있습니다.

WHERE 절이 payment_transactions.transaction_date> = campaign_groups.date_created인지 확인하기 때문에 트랜잭션이없는 행은 제외됩니다.

LEFT JOIN이 행을 반환 할 때만 WHERE 절을 적용 할 수 있습니까?

SELECT sum(payment_transactions.transaction_amount) as payment, 
      new_advertisers.account_id, 
      new_advertisers.advertiser_id, 
      max(payment_transactions.transaction_date) as last_payment, 
      campaign_groups.id, 
      campaign_groups.date_created, 
      TIMESTAMPDIFF(DAY, max(payment_transactions.transaction_date), NOW()) as days_passed 
     FROM campaign_groups 
     INNER JOIN new_advertisers ON campaign_groups.advertiser_id = new_advertisers.advertiser_id 
     LEFT JOIN payment_transactions ON payment_transactions.account_id = new_advertisers.account_id 
     WHERE payment_transactions.transaction_date >= campaign_groups.date_created 
      AND campaign_groups.weekly_budget_cents > 0 
     ORDER BY days_passed DESC 

답변

2
은 ON 절에 조건을 이동

:

LEFT JOIN payment_transactions 
    ON payment_transactions.account_id = new_advertisers.account_id 
    AND payment_transactions.transaction_date >= campaign_groups.date_created 
WHERE campaign_groups.weekly_budget_cents > 0 
+0

그래서이 작동 셈 이죠. SELECT (예 : SUM, MAX)에서 집계 함수를 제거하면 해당 필드가 집계 될 수 없기 때문에 작동합니다 (존재하지 않는 경우)? 확인하려면 IFNULL을 추가하려고했지만 도움이되지 않았습니다. 예 : IFNULL (SUM (payment_transactions.transaction_amount), 0)으로 지불, – Zach

+0

@Zach : 쿼리가 잘못되었습니다. GROUP BY가 누락 되었습니까? 집계 함수를 사용할 때 일반적으로 집계 함수 나 GROUP BY 절이 아닌 필드를 SELECT 목록에 포함시키는 것은 실수입니다. 실제로 대부분의 다른 데이터베이스는 오류를 즉시 발생시키고 해당 쿼리를 실행하지 않습니다. 쓸모없는 결과를 반환하는 대신 쿼리에 오류가 발생할 수 있도록 MySQL을보다 엄격하게 구성 할 수 있습니다. 자세한 내용은 여기를 참조하십시오. http://dev.mysql.com/doc/refman/5.6/en/group-by-hidden-columns.html –

+0

아, 그 트릭을했습니다. new_advertisers.account_id에 GROUP BY를 추가하고 days_passed에 IFNULL() 테스트가 필요했습니다 (반환 된 트랜잭션이 없으면 null이 될 것이므로). 도와 주셔서 감사합니다! – Zach