内部联接与右表的空结果

dav*_*dav 3 mysql inner-join

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

restaurants table
id
name


orders table
id
restaurant_id
date
Run Code Online (Sandbox Code Playgroud)

我需要找到在某个日期范围内没有订单的餐馆.在订单表中,我保存订单日期,例如 - 每行代表一天.所以,我需要进行内连接,但没有来自orders表的结果.说,我需要找到免费的2013-08-09 to 2013-08-11日期范围的餐馆.我怎样才能做到这一点?如何根据日期范围进行查询,这将使订单表中的餐馆没有匹配?

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

谢谢

Wir*_*rus 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;
Run Code Online (Sandbox Code Playgroud)

或者您可以使用not exists其他答案中显示的方式进行操作.

  • +1.这是经典的"反连接"模式:LEFT JOIN用于查找匹配的行(所有餐厅以及匹配的订单),然后是WHERE子句以消除订单中具有匹配行的餐馆.这通常比使用"NOT IN"或"NOT EXISTS"谓词的等效查询. (2认同)