Reputation: 433
I have the following data set:
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');
Simply I need to check if car is available on date range. I need this condition:
Don't return mercedes when
Check in date Check out date
2018-01-16 2018-01-20
2018-01-17 2018-01-20
2018-01-17 2018-01-21
Return mercedes when:
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
My database is located on this link: http://sqlfiddle.com/#!9/28a38d/1
Upvotes: 0
Views: 698
Reputation: 33935
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 |
+--------+----------+---------+---------------+----------------+
Upvotes: 2