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

时间:2013-08-21 13:16:07

标签: mysql sql join

我有2个表,餐馆和订单,订单表包含restaurant_idstatusdate字段,每天都是订单表中的单独行。

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

像这样的Smth

enter image description here

因此,这意味着如果在该日期范围内满足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这样的子句,但它会出错。

感谢

1 个答案:

答案 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