7

我有 2 个表,餐馆和订单,订单表有和restaurant_id字段,每天都是订单表中的单独一行。statusdate

我需要过滤餐厅并仅显示在某个日期范围内至少有一次预订的餐厅,但我必须在日历上显示它,它应该看起来像带有信息的餐厅列表。

像这样

在此处输入图像描述

因此,这意味着如果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' 

因为,在这种情况下,例如,我将没有餐厅 2 的 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 

但我还需要添加一个条件以确保至少有一行订单的状态 = 'reserved',我尝试添加 where 子句,COUNT(o.status = 1) > 0但它给出了错误。

谢谢

4

1 回答 1

5

我认为实现这一点的最佳方法(假设“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;

SQL Fiddle 示例

于 2013-08-21T14:10:46.147 回答