我有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'
Run Code Online (Sandbox Code Playgroud)
因为,在这种情况下,例如,对于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
Run Code Online (Sandbox Code Playgroud)
但我还需要添加一个条件,以保证至少有一个排,订单的状态="保留",我试图添加其中类似的条款COUNT(o.status = 1) > 0,但它给出了一个错误.
谢谢
我认为实现此目标的最佳方法(假设“N/A”和“保留”等内容存储在订单表中是在第一个实例中连接到所有订单,然后使用第二个连接将其限制为仅餐厅在此期间内有预订的:
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;
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
3458 次 |
| 最近记录: |