2016-12-22 5 views
0

0을 얻을 수없는 경우에 나는이 쿼리가 :관련 테이블에서 SUM을 가져옵니다. 합

$sql = "SELECT m.id FROM members m 
      LEFT JOIN orders o ON o.user_id = m.id AND 
      YEAR(date) = YEAR(CURRENT_DATE - INTERVAL 1 MONTH) AND 
      MONTH(date) = MONTH(CURRENT_DATE - INTERVAL 1 MONTH) 
      LEFT JOIN transactions t ON t.user_id = o.user_id"; 

내가 transactions.points의 합계를 얻을 필요를, 그래서이 수행

$sql = "SELECT m.id, COALESCE(SUM(t.points), 0) AS total_points FROM members m 
      LEFT JOIN orders o ON o.user_id = m.id AND 
      YEAR(date) = YEAR(CURRENT_DATE - INTERVAL 1 MONTH) AND 
      MONTH(date) = MONTH(CURRENT_DATE - INTERVAL 1 MONTH) 
      LEFT JOIN transactions t ON t.user_id = o.user_id"; 

그러나이 나는 이것을 실행하면, I 일부 거래 (및 주문)가있는 행만 가져옵니다. 트랜잭션이 발견되지 않을 때 total_points를 0으로 얻으려면 어떻게해야합니까?

텍스트 설명 : 지난 달에 주문이 생성 된 (주문 테이블) 주문의 포인트 보상 (거래 테이블에서) 합계를 얻고 싶습니다.

감사합니다.

답변

0

당신은 당신이 실제로 전체 결과 집합에 SUM()을 수행하는 않고도 쿼리에 GROUP BY 절을 추가해야합니다. 어느 열에 있는지 잘 모르겠다. m.id

$sql = "SELECT m.id, COALESCE(SUM(t.points), 0) AS total_points FROM members m 
      LEFT JOIN orders o ON o.user_id = m.id AND 
      YEAR(date) = YEAR(CURRENT_DATE - INTERVAL 1 MONTH) AND 
      MONTH(date) = MONTH(CURRENT_DATE - INTERVAL 1 MONTH) 
      LEFT JOIN transactions t ON t.user_id = o.user_id 
      GROUP BY m.id"; 
1

사용자 당 포인트 합계를 가져와 left join에 사용하면 사용자가 거래가 없을 때 0이됩니다.

SELECT m.id, COALESCE(t.total_points, 0) AS total_points 
FROM members m 
LEFT JOIN orders o ON o.user_id = m.id AND 
/* use this instead of functions which prevent indexes on the date column from being used */ 
o.date >= date '2016-11-01' AND o.date <= date '2016-11-30' 
LEFT JOIN (select user_id, SUM(points) total_points 
      from transactions group by user_id) t ON t.user_id = o.user_id 
+0

이것은 나를 위해 작동하지 않습니다. – mabezdek

+0

편집 된 버전을 사용해보십시오. 파생 된 테이블에 별칭't'가 있습니다 .i 제거했습니다. –

+0

아직도 작동하지 않습니다. 위의 해결 방법은 잘 작동하지만 매우 감사합니다. – mabezdek

관련 문제