2011-01-16 5 views
7

다음 쿼리를 사용하여 하루에 페이지 열 수를 얻으려고합니다.왼쪽 외부 조인이 왼쪽 테이블의 모든 행을 반환하지 않습니까?

SELECT day.days, COUNT(*) as opens 
FROM day 
LEFT OUTER JOIN tracking ON day.days = DAY(FROM_UNIXTIME(open_date)) 
WHERE tracking.open_id = 10 
GROUP BY day.days 

출력 나는 그것이 이것이다 얻을 :

days opens 
1 9 
9 2 

, 내 하루 테이블에, 나는 한 달에 일을 대표하는 30까지의 숫자를 포함하는 하나의 열이되는 것 . 나는 왼쪽 외부 조인을했고 모든 날을 날 기둥에 보여 주길 기대하고 있습니다!

하지만 내 쿼리가 그 이유는 무엇입니까?

모든 도움을 주셔서 감사합니다.

답변

14

연결된 tracking.open_id를 10으로 지정해야합니다. 다른 행의 경우 NULL이되므로 표시되지 않습니다!

+0

AH! 그 말이 맞아, 고마워! – Abs

+0

@ Nanne 당신이 실수 할 수 있다고 생각합니다 +1 –

43

Nanne's answer 주어진 결과 (WHERE 절이 행을 제거함)를 얻지 못하는 이유는 설명하지만 수정 방법은 설명하지 않습니다.

용액 변경되는 경우 등 조건 조인 조건의 일부는 다음에 적용하지 필터가 있음에 조인 왼쪽 테이블

SELECT day.days, COUNT(*) as opens 
FROM day 
LEFT OUTER JOIN tracking 
ON day.days = DAY(FROM_UNIXTIME(open_date)) 
AND tracking.open_id = 10 
GROUP BY day.days 

모든 행이 존재할 것이다 결과.

+1

where 절은 표시와 같이 조인 절에 술어를 넣는 것을 선호하지만 where 절 (tracking.open_id IS NULL 또는 tracking.open_id = 10)으로 변경 될 수있었습니다 그게 가장 의미가 있다고 생각 하듯이. – goat

+2

@chris : 조인이 실패 할 때 작동하지만 조인은 성공하지만 조인하는 행에는 'tracking.open_id'가 10이 아닌 다른 값과 같은 경우 작동하지 않습니다.이 경우 행은 계속 제거됩니다. –

+0

doh! 네가 옳아. – goat

관련 문제