3

我有2张桌子,餐厅和订单,每个餐厅可以有很多订单

restaurants table
id
name


orders table
id
restaurant_id
date

我需要找到在某个日期范围内没有订单的餐厅。在订单表中,我将订单日期保存为 - 每行代表一天。所以,我需要进行内部连接,但订单表没有结果。比如说,我需要找到不受2013-08-09 to 2013-08-11日期范围限制的餐厅。我怎样才能做到这一点?如何进行查询,根据日期范围给出订单表中没有匹配的餐厅?

实际上,我可以用状态 not_ordered 保存订单表中的所有日期,并使用not_ordered = true条件进行内部连接,但在这种情况下,我将不得不用日期填充所有表,这对我来说不是一件好事。

谢谢

4

3 回答 3

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其他答案中所示的方法进行操作。

于 2013-08-08T21:11:44.290 回答
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'
);
于 2013-08-08T21:12:00.993 回答
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')
于 2013-08-08T21:12:02.903 回答