问题
I have 2 tables, restaurants and orders, each restaurant can have many orders
restaurants table
id
name
orders table
id
restaurant_id
date
I need to find the restaurants that have no orders on some date range. In orders table I save the order dates like - each row represents one day. So, I need to make inner join, but with no results from the orders table. Say, I need to find restaurants that are free from 2013-08-09 to 2013-08-11
date range. How can I achieve this ? How to make a query, that will give the restaurants with no matching in the orders table - according to the date range ?
Actually I can do it saving all the dates in the orders table with status not_ordered, and make inner join with not_ordered = true
condition, but in that case I will have to populate all the table with the dates, which is not a good thing in my case.
Thanks
回答1:
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;
Or you can do it using not exists
as shown in other answers.
回答2:
You don't want to use an inner join for this. You can do it with an outer join, or with NOT EXISTS
and a sub-query.
Here's an example of the latter approach:
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'
);
回答3:
I don't know mysql very well, but this should work as general 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')
来源:https://stackoverflow.com/questions/18136113/inner-join-with-empty-result-from-right-table