2011-03-25 4 views
0

에서 모든 행을 표시하지 조인 다음과 같이 그래서 concered 내 두 테이블의 대략적인 구조는 다음과 같습니다SQL 왼쪽 왼쪽

Table one: Services 
services.id 
services.name 

Table two: Orders 
orders.id 
orders.item 
orders.service 

표 사용자가 서비스의 목록이 포함되어 있습니다. 그리고 표 2는 주문 목록입니다. 나는 테이블 2 (주문)에서 서비스에 대한 모든 주문 목록을 생성하려고하지만 주문하지 않은 서비스 (Zero)도 포함하려고합니다. LEFT JOIN이 오는 부분이지만 그것이 전혀 작동하지 않는 것 같습니다. 대부분의 서비스를 표시하지만 표시되지 않는 서비스에서 하나 또는 두 개의 레코드가 있습니다. 여기까지 내가 지금까지 사용하고있는 쿼리가 있습니다 ..

어떤 지침도 감사합니다!

select services.name,count(orders.service) 
from services 
LEFT JOIN orders ON services.id=orders.service 
WHERE item IN (1,2,3,4) 
group by statuses.service; 

답변

5

원래 선택은 정상이며 서비스 테이블의 모든 레코드를 허용해야합니다. 그러나 당신은 당신의 where 절에 의해 이것을 제한 할 것입니다. 특정 행에 대한 조인이 없으면 은 WHERE 절이 필터링되어 NULL이됩니다.

SELECT services.name 
    ,COUNT(orders.service) 
FROM services 
LEFT JOIN orders ON services.id = orders.service 
WHERE item IS NULL 
    OR item IN (1, 2, 3, 4) 
GROUP BY statuses.service; 

약간 잘못 생각하면 용서해 주겠다. SQL Server 배경에서 사용하고있다.

+1

아마도 조인 조건에 IN 절을 이동 좋을 것이다 : 'ON services.id = orders.service AND IN 항목 (...)' –

+0

이 더 의미가 있습니다 항목이 널 (null) 일 때 결합 조건에 넣으십시오. 잘못된 숫자로 연결됩니다 (이 값은 (1,2,3,4)에없는 항목도 포함합니다) –

+0

만큼 http : // www. wellho.net/mouth/158_MySQL-LEFT-JOIN-and-RIGHT-JOIN-INNER-JOIN-and-OUTER-JOIN.html 예를 들어 mysql에서 join join도 null 값을 가져올 수있다. 그래서 "null이"쓰는 것은 내가 추측하는 요구 사항이 아니다. – Bastardo

4

우선, 오타가 있다고 생각합니다. status.service는 services.name이어야합니다. 맞습니까? 항목은 주문 테이블에서 열이기 때문에

, 당신은 조인 조건에 넣어해야합니다

select services.name,count(orders.service) 
from services 
LEFT JOIN orders ON services.id=orders.service and services.item IN (1,2,3,4) 
group by statuses.service; 

그렇지 않으면, 당신은 누구의 주문뿐만 아니라 항목이 (1 주문없이 서비스 또는 필터링, 2,3,4).

종류 안부, 프랭크

+0

분명히 더 현명한! –