2012-10-01 2 views
2

왼쪽 조인은 왼쪽 테이블의 모든 행을 표시해야하지만 다음 쿼리를 실행할 때 하나 이상의 카운트가있는 위치 값만 가져옵니다. 누군가가 내가 잘못 갈 수있는 곳으로 나에게 몇 가지 지침을 제공 할 수 있습니다하십시오 : 당신은 orderstateId = 1 말을하는 사전모든 왼쪽 테이블 값을 표시하지 않는 왼쪽 조인

+2

쿼리의 모든 다양한 열은 어떤 테이블에 있습니까? 'stateId, orderstateId, orderName' 중 하나라도'orders'에 있다면 당신은 관련 필터를'where'보다는 join으로 옮길 필요가 있습니다. –

+0

@ MartinsSmith 답변에 넣어서 내가 업 그레 이드 할 수 있도록하십시오. – Barmar

+0

stateId, orderstateId 및 orderName은 모두 orders 테이블에 있습니다. 순서가없는 모든 장소를 가져 오는 두 번째 쿼리를 수행하여 반올림 할 수 있지만 가능한 경우 피하려고했습니다. –

답변

15

WHERE 조건은 OUTER JOININNER JOIN으로 다시 변환합니다.

일치하지 않는 행은 모든 orders 열에 대해 NULL이고 WHERE 절에 의해 제거됩니다. 이 시도.

SELECT places.placeId, 
     placeName, 
     COUNT(orderId) AS orderCount 
FROM places 
     LEFT JOIN orders 
     ON places.placeId = orders.placeId 
     AND orders.stateId = 1 
     AND orders.orderstateId = 1 
     AND orders.orderName NOT LIKE 'Delivery%' 
WHERE places.companyId = 1 
GROUP BY places.placeId, 
      places.placeName 
ORDER BY orderCount DESC, 
      placeName ASC 
+0

도움 주셔서 감사합니다. 정말 감사합니다. –

0

에서

SELECT places.placeId, 
     placeName, 
     COUNT(orderId) AS orderCount 
FROM places 
     LEFT JOIN orders 
     ON places.placeId = orders.placeId 
WHERE places.companyId = 1 
     AND stateId = 1 
     AND orderstateId = 1 
     AND orderName NOT LIKE 'Delivery%' 
GROUP BY places.placeId, 
      places.placeName 
ORDER BY orderCount DESC, 
      placeName ASC 

감사합니다. 나는 이것이 orders.orderstateId = 1에 바인딩하는 것 같아요. 이 조건은 일치하지 않고 왼쪽으로 결합 할 때 발생하는 null orderstateId에 대해 실패합니다. stateID, orderstateIDOrderNameORDERS 테이블에서 온이 컬럼은 다음 다음 문제가있는 경우 orders.orderstateId = 1 OR orders.orderstateId IS NULL

1

변경을. 위에서 볼 수 있듯이 orders 테이블에 places.placeID이 없으면 orders 테이블의 다음 열은 nulls입니다. 그리고 그것이 당신이 orders 테이블에 제공 한 조건으로 인해 일부 기록이 보이지 않는 이유입니다.

0

LEFT JOIN을 사용하는 경우에도 모든 행은 WHERE 절의 조건을 충족해야합니다. 이 경우 WHERE 절에는 orders과 관련된 요구 사항이 있으므로 orders이 일치하지 않는 행은 places으로 반환되지 않습니다.

간단한 수정은 null 값이 WHERE 절을 충족 할 수 있도록하는 것입니다 : 다른 변수

orderstateId = 1

(orderstateId is NULL or orderstateId = 1)

변경과 마찬가지로.

이것은 아마도 사용자가 원하는대로 수행 할 수 있지만 orders 테이블의 null 값을 가진 행을 포함시켜 결과를 엉망으로 만들 수 있는지 확인해야합니다. 다른 방법으로 쿼리를 다시 디자인하는 것이 더 좋을 수도 있습니다.