sql >> Databáze >  >> RDS >> Mysql

Kalendář rezervací Termíny příjezdů a odjezdů

Zvažte následující...

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

Takže SELECTy mohou vypadat takto...

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

...ale nemusíte je nejprve kontrolovat. Záměrně jsem napsal SELECTy tak, aby kontrola mohla proběhnout jako součást 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  |
+---------+-------------+-------------+

V praxi a v závislosti na uživatelské zkušenosti, kterou chcete poskytnout, možná budete chtít nejprve spustit SELECTy, aby uživatel okamžitě viděl, která data nejsou k dispozici, a poté spustit INSERTy, když dojde na rezervaci – abyste se ujistili, že tato data nikdo nezískal, když byl uživatel v polovině rezervace.



  1. Délka indexu varchar MySQL

  2. Jak mohu vytvořit kopii tabulky Oracle bez kopírování dat?

  3. WebApp (Tomcat-jdbc) Sdružené připojení DB vyvolá výjimku opuštění

  4. Jak vytvořit pohledy historie NEBO auditování z tabulek pro zachycení změn dat (CDC) na serveru SQL Server - kurz SQL Server