>데이터 베이스 >MySQL 튜토리얼 >내 왼쪽 외부 조인이 왼쪽 테이블의 모든 행을 반환하지 않는 이유는 무엇입니까?

내 왼쪽 외부 조인이 왼쪽 테이블의 모든 행을 반환하지 않는 이유는 무엇입니까?

Patricia Arquette
Patricia Arquette원래의
2025-01-23 15:51:10620검색

Why Doesn't My Left Outer Join Return All Rows from the Left Table?

왼쪽 외부 조인: 왼쪽 테이블에서 완전한 데이터 검색 보장

왼쪽 외부 조인에 대한 일반적인 오해는 항상 왼쪽 테이블의 모든 행을 반환한다는 것입니다. 이것이 항상 사실은 아닙니다. 조인 조건에 따라 오른쪽 테이블에 일치하는 행이 없으면 왼쪽 테이블의 행은 생략됩니다.

예를 들어 설명해 보겠습니다. 특정 사용자(open_id)의 일일 페이지 조회수를 계산하도록 설계된 쿼리를 상상해 보세요.

<code class="language-sql">SELECT day.days, COUNT(*) AS views
FROM day
LEFT OUTER JOIN tracking
ON day.days = DAY(FROM_UNIXTIME(open_date))
WHERE tracking.open_id = 10
GROUP BY day.days</code>

이 쿼리는 모든 날짜와 관련 조회수를 표시하려고 합니다. 그러나 day에 해당 월의 모든 날짜에 대한 항목이 포함되어 있지만 trackingopen_id = 10에 대한 항목이 며칠 동안 없으면 해당 날짜는 결과에서 제외됩니다.

해결책은 WHERE 절 조건을 조인의 ON 절에 통합하는 것입니다.

<code class="language-sql">SELECT day.days, COUNT(tracking.open_date) AS views
FROM day
LEFT OUTER JOIN tracking
ON day.days = DAY(FROM_UNIXTIME(open_date)) AND tracking.open_id = 10
GROUP BY day.days</code>

tracking.open_id = 10ON 절로 이동하면 조건이 조인 후 필터가 아닌 조인 자체의 일부가 됩니다. 이렇게 하면 day 테이블의 모든 행이 포함되고 views 테이블의 항목이 일치하지 않는 날에는 tracking이 0으로 표시됩니다. 조회수를 정확하게 반영하려면 COUNT(tracking.open_date) 대신 COUNT(*)을 사용하세요. COUNT(*) 오른쪽 테이블에 일치하는 행이 없더라도 여전히 날짜를 계산합니다.

위 내용은 내 왼쪽 외부 조인이 왼쪽 테이블의 모든 행을 반환하지 않는 이유는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.