2013-08-08 4 views
3

에서 빈 결과와 결합, 각 레스토랑은 많은 주문 좀 날짜 범위에는 주문이없는 레스토랑을 찾을 필요가 내가 2 테이블, 레스토랑, 주문이 바로 테이블

restaurants table 
id 
name 


orders table 
id 
restaurant_id 
date 

을 가질 수 있습니다. 주문 테이블에서 주문 날짜를 저장합니다. 각 행은 하루를 나타냅니다. 따라서 내부 조인을해야하지만 orders 테이블의 결과는 없습니다. 예를 들어 2013-08-09 to 2013-08-11 기간의 레스토랑을 찾아야합니다. 이것을 어떻게 할 수 있습니까? 주문 테이블에서 일치하지 않는 레스토랑을 제공하는 검색어를 만드는 방법 - 날짜 범위에 따라?

실제로 주문 테이블의 모든 날짜를 not_ordered 상태로 저장하고 not_ordered = true 조건으로 내부 조인을 할 수 있지만 그 경우에는 모든 테이블에 좋은 날짜가 채워져 있어야합니다 내 경우 엔.

감사

+0

보기 (HTTP : //stackoverflow.com/questions/367863/sql-find-records-from-one-table-which-dont-exist-in- other) 비슷한 문제가 있지만 조인에 액센트가 없다면 – rook

답변

9
select r.* 
from restaurant r 
left join orders o on r.id = o.restaurant_id and o.date between '...' and '...' 
where o.id is null; 

아니면 다른 답변에서와 같이이 not exists를 사용하여 수행 할 수 있습니다.

+2

+1. 이것은 고전적인 "반대 결합"패턴입니다 : LEFT JOIN을 사용하면 일치하는 행 (일치하는 주문과 함께 모든 레스토랑)을 찾은 다음 WHERE 절을 사용하여 주문에 일치하는 행이있는 레스토랑을 제거 할 수 있습니다. 'NOT IN' 또는'NOT EXISTS' 술어를 사용하는 동등한 쿼리 – spencer7593

3

내부 결합을 사용하지 않으려합니다. 외부 조인 또는 NOT EXISTS과 하위 쿼리로 수행 할 수 있습니다. 여기

는 후자의 방법의 예 :

select r.id,r.name 
from restaurants r 
where not exists (
    select NULL 
    from orders o 
    where o.restaurant_id = r.id 
    and o.date >= '2013-08-09' 
    and o.date <= '2013-08-11' 
); 
+0

+1 상관 된 하위 쿼리는 외부 쿼리의 표현식에 대한 참조를가집니다. – spencer7593

+1

anti-join을 더 자주 사용 합니다만, 두 접근법을 아는 것이 유용하다고 생각합니다. –

+0

나는 두 접근법을 모두 알고있는 것이 유용하다는 데 동의합니다. 그래서 나는 대답을 너무 많이 받았다. 가끔 'NOT EXISTS 'predicate가 더 적절한 접근법이다. – spencer7593

0

내가 잘 MySQL은 모르겠지만, 이것은 일반적으로 SQL로 작동합니다 : [여기]

SELECT * 
FROM restaurants 
WHERE NOT EXISTS(SELECT 1 
       FROM order 
       WHERE restaurant_id=id AND 
         date BETWEEN '2013-08-09' AND '2013-08-11') 
+0

하위 쿼리의'id'는'restaurant' 테이블이나'order' 테이블의'id' 열에 대한 참조인가요? 모범 사례는 열 참조가 quali가되도록 지시합니다 테이블 이름 또는 바람직하게는 테이블 별칭으로 연결됩니다. – spencer7593