左连接至少一行,右边是mysql的条件

dav*_*dav 5 mysql sql join

我有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,但它给出了一个错误.

谢谢

Gar*_*thD 6

我认为实现此目标的最佳方法(假设“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)

SQL Fiddle 示例