Simak berikut ini...
DROP TABLE IF EXISTS my_table;
CREATE TABLE my_table
(book_id INT NOT NULL AUTO_INCREMENT PRIMARY KEY
,arrive_date DATE NOT NULL
,depart_date DATE NOT NULL
);
INSERT INTO my_table VALUES
(1,'2015-07-20','2015-07-22'),
(2,'2015-07-22','2015-07-23'),
(3,'2015-07-19','2015-07-20');
SELECT * FROM my_table;
+---------+-------------+-------------+
| book_id | arrive_date | depart_date |
+---------+-------------+-------------+
| 1 | 2015-07-20 | 2015-07-22 |
| 2 | 2015-07-22 | 2015-07-23 |
| 3 | 2015-07-19 | 2015-07-20 |
+---------+-------------+-------------+
Jadi, SELECT mungkin terlihat seperti ini...
SELECT '2015-07-22','2015-07-24'
FROM (SELECT 1) x
LEFT
JOIN my_table y
ON y.arrive_date < '2015-07-24' AND y.depart_date > '2015-07-22'
WHERE y.book_id IS NULL
LIMIT 1;
Empty set (0.00 sec)
SELECT '2015-07-23','2015-07-24'
FROM (SELECT 1) x
LEFT
JOIN my_table y
ON y.arrive_date < '2015-07-24' AND y.depart_date > '2015-07-23'
WHERE y.book_id IS NULL
LIMIT 1;
+------------+------------+
| 2015-07-23 | 2015-07-24 |
+------------+------------+
| 2015-07-23 | 2015-07-24 |
+------------+------------+
...tapi Anda tidak perlu memeriksanya terlebih dahulu. Saya sengaja menulis SELECT sedemikian rupa sehingga pemeriksaan dapat terjadi sebagai bagian dari INSERT...
INSERT INTO my_table (arrive_date,depart_date)
SELECT '2015-07-23','2015-07-24'
FROM (SELECT 1) x
LEFT
JOIN my_table y
ON y.arrive_date < '2015-07-24' AND y.depart_date > '2015-07-23'
WHERE y.book_id IS NULL
LIMIT 1;
SELECT * FROM my_table;
+---------+-------------+-------------+
| book_id | arrive_date | depart_date |
+---------+-------------+-------------+
| 1 | 2015-07-20 | 2015-07-22 |
| 2 | 2015-07-22 | 2015-07-23 |
| 3 | 2015-07-19 | 2015-07-20 |
| 4 | 2015-07-23 | 2015-07-24 |
+---------+-------------+-------------+
Dalam praktiknya, dan bergantung pada pengalaman pengguna yang ingin Anda berikan, Anda mungkin ingin menjalankan SELECT terlebih dahulu, sehingga pengguna dapat segera melihat tanggal mana yang tidak tersedia, lalu menjalankan INSERT saat melakukan pemesanan - untuk memastikan tidak ada yang mengambil tanggal tersebut saat pengguna sedang melakukan pemesanan.