我有2个表,餐馆和订单,订单表包含restaurant_id
,status
和date
字段,每天都是订单表中的单独行。
我需要过滤餐厅并仅显示在某个日期范围内至少有一个预订的餐厅,但我必须在日历上显示它,它应该看起来像一个有信息的餐馆列表。
像这样的Smth
因此,这意味着如果在该日期范围内满足at least one day with reserved status
条件,则应该同时获取该餐厅的该日期范围的所有订单。
我无法进行通常的内部联接,
SELECT r.`id`, r.`name`, o.`date`, o.`status`
FROM restaurants r
INNER JOIN orders o ON r.id = o.restaurant_id AND o.date BETWEEN '2013-08-10' AND '2013-08-31'
AND status = 'reserved'
因为,在这种情况下,例如,对于restaurant2,我将不会获得8月31日的订单信息,因为虽然它的日期范围为10 - 31,但其状态为“已关闭”。 所以,我想像这样做一个左连接
SELECT r.`id`, r.`name`, o.`date`, o.`status`, o.`id` order_id
FROM restaurants r
LEFT JOIN orders o ON r.id = o.restaurant_id AND
o.date BETWEEN '2013-08-10' AND '2013-08-31'
WHERE o.`id` IS NOT NULL
但我还需要添加一个条件以确保至少有一行具有order的status ='reserved',我试图添加where COUNT(o.status = 1) > 0
这样的子句,但它会出错。
感谢
答案 0 :(得分:3)
我认为实现这一目标的最佳方式(假设订单表中存储'N / A'和'reserved'之类的东西是在第一个实例中加入所有订单,然后使用第二个连接来限制它仅限在此期间内有预订的餐馆:
SELECT r.`id`, r.`name`, o.`date`, o.`status`, o.`id` order_id
FROM restaurants r
INNER JOIN orders o
ON r.id = o.restaurant_id
AND o.date BETWEEN '2013-08-10' AND '2013-08-31'
INNER JOIN
( SELECT DISTINCT o2.Restaurant_ID
FROM orders o2
WHERE o2.date BETWEEN '2013-08-10' AND '2013-08-31'
AND o2.Status = 'Reserved'
) o2
ON r.id = o2.restaurant_id;
<强> Example on SQL Fiddle 强>