gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-29 13:39:02 24 4
gpt4 key购买 nike

我有餐厅和订单表,在订单表中我有 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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com