여러 SQL LEFT JOIN을 사용한 부정확한 방문 횟수 이해
이 문서에서는 일반적인 SQL 쿼리 문제인 여러 LEFT JOIN
작업을 사용할 때 잘못된 방문 횟수를 얻는 문제를 조사합니다. 목표는 계좌 잔액, 식료품점 방문, 수산시장 방문을 포함한 사용자 데이터를 검색하는 것입니다. 순진한 쿼리는 부풀려진 결과(예: "1", "12", "12")를 생성하는 경우가 많습니다.
문제는 LEFT JOIN
을 왼쪽에서 오른쪽으로 실행하는 데서 발생합니다. 조인된 테이블에 일치하는 항목이 여러 개 있는 경우 각 후속 조인은 행 수를 곱합니다. 예를 들어 식료품점 세 개를 한 명의 사용자에게 결합하면 세 개의 행이 생성됩니다. 이후 4개의 수산시장 테이블을 조인하면 12개의 행으로 확장되어 방문 횟수가 부정확해집니다.
해결책: 하위 쿼리를 사용한 사전 집계
이 솔루션은 각 테이블을 users
테이블에 추가하기 전에 각 테이블의 방문 횟수를 사전 집계하는 것입니다. 이렇게 하면 행 곱셈 문제가 방지됩니다. 수정된 쿼리는 이를 달성하기 위해 하위 쿼리를 사용합니다.
<code class="language-sql">SELECT u.id, u.account_balance, g.grocery_visits, f.fishmarket_visits FROM users u LEFT JOIN ( SELECT user_id, COUNT(*) AS grocery_visits FROM grocery GROUP BY user_id ) g ON g.user_id = u.id LEFT JOIN ( SELECT user_id, COUNT(*) AS fishmarket_visits FROM fishmarket GROUP BY user_id ) f ON f.user_id = u.id ORDER BY u.id;</code>
COALESCE로 누락된 값 처리
사용자가 특정 위치를 방문하지 않은 경우를 적절하게 처리하기 위해 COALESCE
함수는 NULL
값을 0(또는 원하는 다른 값)으로 바꿀 수 있습니다.
<code class="language-sql">SELECT u.id, u.account_balance, COALESCE(g.grocery_visits, 0) AS grocery_visits, COALESCE(f.fishmarket_visits, 0) AS fishmarket_visits FROM users u LEFT JOIN ( SELECT user_id, COUNT(*) AS grocery_visits FROM grocery GROUP BY user_id ) g ON g.user_id = u.id LEFT JOIN ( SELECT user_id, COUNT(*) AS fishmarket_visits FROM fishmarket GROUP BY user_id ) f ON f.user_id = u.id ORDER BY u.id;</code>
이 향상된 쿼리는 각 사용자의 식료품점 및 수산시장 방문 횟수를 정확하게 반영합니다. 데이터를 사전 집계함으로써 계단식 LEFT JOIN
의 위험을 방지하고 정확한 결과를 보장합니다.
위 내용은 여러 SQL LEFT JOIN이 잘못된 방문 횟수를 생성하는 이유는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!