mysql预订查询
我有以下数据集:mysql预订查询,mysql,date,where,Mysql,Date,Where,我有以下数据集: CREATE TABLE IF NOT EXISTS `cars` ( `car_id` int(11) NOT NULL AUTO_INCREMENT, `car_name` varchar(20) NOT NULL, PRIMARY KEY (`car_id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=3 ; INSERT INTO `cars` (`car_id`, `car_name`) VA
CREATE TABLE IF NOT EXISTS `cars` (
`car_id` int(11) NOT NULL AUTO_INCREMENT,
`car_name` varchar(20) NOT NULL,
PRIMARY KEY (`car_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=3 ;
INSERT INTO `cars` (`car_id`, `car_name`) VALUES
(1, 'Mercedes'),
(2, 'BMW');
CREATE TABLE IF NOT EXISTS `orders` (
`order_id` int(11) NOT NULL AUTO_INCREMENT,
`order_car_id` int(11) NOT NULL,
`order_date_checkin` datetime DEFAULT NULL,
`order_date_dropoff` datetime DEFAULT NULL,
PRIMARY KEY (`order_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=3 ;
INSERT INTO `orders` (`order_id`, `order_car_id`, `order_date_checkin`, `order_date_dropoff`) VALUES
(1, 1, '2018-01-17 10:00:00', '2018-01-19 21:00:00'),
(2, 1, '2018-01-22 14:00:00', '2018-01-25 17:00:00');
只是我需要检查一下汽车是否在日期范围内可用。我需要这个条件:
不要在任何时候还梅赛德斯
Check in date Check out date
2018-01-16 2018-01-20
2018-01-17 2018-01-20
2018-01-17 2018-01-21
在下列情况下返回梅赛德斯:
Check in date Check out date
2018-01-16 2018-01-16
2018-01-16 2018-01-17
2018-01-19 2018-01-21
2018-01-20 2018-01-21
2018-01-27 2018-01-30
我的数据库位于以下链接上:对于SQL问题,请务必包含您提供的信息,但通常情况下,如果您包含一个带有数据结构+一些虚拟数据设置的SQLFiddle SQLFiddle.com,人们会更快。SQL fiddle中的数据似乎并不能反映问题中的所有情况。ADyson我不明白我的数据库哪里出了问题?我认为在我身边一切都是正确的。如果丢失了什么,请告诉我为什么不退回宝马?@AyxanƏmiraslanlı我的意思是你的SQLFiddle没有准备好使用,因为你提供的示例数据没有涵盖你在问题中提到的所有可能性,仅此而已。无论如何,我看到草莓帮你做了,然后解决了它,所以这很好。对于SQL问题,请包含你提供的信息,但是,通常情况下,如果您包含一个带有数据结构+一些虚拟数据设置的SQLFiddle SQLFiddle.com,对人们来说速度会更快。SQLFiddle中的数据似乎并不能反映问题中的所有场景。ADyson我不明白我的数据库哪里出了问题?我认为在我身边一切都是正确的。如果丢失了什么,请告诉我为什么不退回宝马?@AyxanƏmiraslanlı我的意思是你的SQLFiddle没有准备好使用,因为你提供的示例数据没有涵盖你在问题中提到的所有可能性,仅此而已。无论如何,我看到草莓帮你做了,然后解决了它,所以这很好。从车c中选择c.*左连接o.order\U car\U id=c.car\U id和o.order\U date\U checkin='2018-01-18',其中o.order\U id是c.car\U id'DESC的空订单简单地说,我更新了您的查询,它成功地从cars c中选择c.*LEFT JOIN orders o ON o.order\U car\U id=c.car\U id和o.order\U date\U checkin='2018-01-18',其中o.order\U id为空order BY c.car\U id`DESC;'我只是更新了你的查询,结果成功了
DROP TABLE IF EXISTS rules;
CREATE TABLE rules
(rule_id INT NOT NULL AUTO_INCREMENT PRIMARY KEY
,Check_in_date DATE NOT NULL
,Check_out_date DATE NOT NULL
);
INSERT INTO rules (Check_in_date,Check_out_date) VALUES
('2018-01-16','2018-01-20'),
('2018-01-17','2018-01-20'),
('2018-01-17','2018-01-21'),
('2018-01-16','2018-01-16'),
('2018-01-16','2018-01-17'),
('2018-01-19','2018-01-21'),
('2018-01-20','2018-01-21'),
('2018-01-27','2018-01-30');
SELECT c.*
, r.*
FROM cars c
JOIN rules r
LEFT
JOIN orders o
ON o.order_car_id = c.car_id
AND o.order_date_checkin <= r.check_out_date -- may be you meant <
AND o.order_date_dropoff >= r.check_in_date -- may be you meant >
WHERE o.order_id IS NULL;
+--------+----------+---------+---------------+----------------+
| car_id | car_name | rule_id | Check_in_date | Check_out_date |
+--------+----------+---------+---------------+----------------+
| 2 | BMW | 1 | 2018-01-16 | 2018-01-20 |
| 2 | BMW | 2 | 2018-01-17 | 2018-01-20 |
| 2 | BMW | 3 | 2018-01-17 | 2018-01-21 |
| 1 | Mercedes | 4 | 2018-01-16 | 2018-01-16 |
| 2 | BMW | 4 | 2018-01-16 | 2018-01-16 |
| 1 | Mercedes | 5 | 2018-01-16 | 2018-01-17 |
| 2 | BMW | 5 | 2018-01-16 | 2018-01-17 |
| 2 | BMW | 6 | 2018-01-19 | 2018-01-21 |
| 1 | Mercedes | 7 | 2018-01-20 | 2018-01-21 |
| 2 | BMW | 7 | 2018-01-20 | 2018-01-21 |
| 1 | Mercedes | 8 | 2018-01-27 | 2018-01-30 |
| 2 | BMW | 8 | 2018-01-27 | 2018-01-30 |
+--------+----------+---------+---------------+----------------+