mysql - 与右表 mysql 中的空行进行左连接

标签 mysql sql join

我有餐厅和订单表,在订单表中我有 restaurant_idstatusdate 字段 - 每天我保存一行在订单表中。如果某一天没有订单 - 这意味着订单表中没有当天的行。

我想根据这两个单独的条件在日历上显示每家餐厅当月的数据。

1) in first case show only those restaurants that have at least one free 
day during this month(which means for this month at least one date is missing in orders table).

2) in second case show only those restaurants that are free for today 
(which means there is no row for today in orders table)

对于这两种情况,如果满足条件,我应该获取当月的所有订单 - 这是棘手的部分。

通常的左连接或内连接反连接不会给出所需的结果。

谢谢。

编辑

输出应该是这样的

1) http://img826.imageshack.us/img826/3114/e6zt.png

2) http://img13.imageshack.us/img13/6397/44l0.png

最佳答案

这是本月所有今天免费的餐厅的所有列表:

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
        LEFT JOIN
        (   SELECT  DISTINCT o2.Restaurant_ID
            FROM    orders o2
            WHERE   o2.date = DATE(CURRENT_TIMESTAMP)
        ) o2
            ON r.id = o2.restaurant_id
WHERE   o.Date >= DATE_FORMAT(CURRENT_TIMESTAMP ,'%Y-%m-01')
AND     o.Date <= DATE_FORMAT(DATE_ADD(CURRENT_TIMESTAMP, INTERVAL 1 MONTH) ,'%Y-%m-01')
AND     o2.Restaurant_ID IS NULL;

这只是获取今天预订的所有餐厅(子查询 o2),然后排除这些餐厅:

AND     o2.Restaurant_ID IS NULL;
<小时/>

这是本月至少有一个免费日的所有餐厅的本月所有列表:

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  o2.Restaurant_ID
            FROM    orders o2
            WHERE   o2.Date >= DATE_FORMAT(CURRENT_TIMESTAMP ,'%Y-%m-01')
            AND     o2.Date <= DATE_FORMAT(DATE_ADD(CURRENT_TIMESTAMP, INTERVAL 1 MONTH) ,'%Y-%m-01')
            GROUP BY o2.Restaurant_ID
            HAVING COUNT(DISTINCT o2.Date) < DAY(DATE_ADD(DATE_FORMAT(DATE_ADD(CURRENT_TIMESTAMP, INTERVAL 1 MONTH) ,'%Y-%m-01'), INTERVAL -1 DAY))
        ) o2
            ON r.id = o2.restaurant_id
WHERE   o.Date >= DATE_FORMAT(CURRENT_TIMESTAMP ,'%Y-%m-01')
AND     o.Date <= DATE_FORMAT(DATE_ADD(CURRENT_TIMESTAMP, INTERVAL 1 MONTH) ,'%Y-%m-01');

诀窍是获取本月的天数:

DAY(DATE_ADD(DATE_FORMAT(DATE_ADD(CURRENT_TIMESTAMP, INTERVAL 1 MONTH) ,'%Y-%m-01'), INTERVAL -1 DAY))

然后将结果限制为预订量少于此的restaurant_id:

HAVING COUNT(DISTINCT o2.Date) < DAY(DATE_ADD(DATE_FORMAT(DATE_ADD(CURRENT_TIMESTAMP, INTERVAL 1 MONTH) ,'%Y-%m-01'), INTERVAL -1 DAY))

<强> Example of Both on SQL Fiddle

关于mysql - 与右表 mysql 中的空行进行左连接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18362311/

相关文章:

MySQL/Mariadb 问题 : `Order by DESC` before `Group by`

Mysql数据库,将存储在文本中的日期(dd/mm/yy)转换为日期时间的问题

bash - 在公共(public)列上合并两个文件并使用 awk 打印所有列

java - Hibernate 约束 ConstraintViolationException。有没有一种简单的方法可以忽略重复的条目?

MySQL 性能删除或更新?

php - mysql中获取表的列名的语法是什么?

php - 从元数据中检索 MySQL 行创建的时间戳?

sql - TF400997 : Configuring Scheduled backup with TFS 2013

mysql - MySQL 中的这个 group by 查询有什么问题?

select - MySQL 从一个表中选择所有列,从另一个表中选择一些列