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     |
+--------+----------+---------+---------------+----------------+