Mysql
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Mysql

Đặt lịch Ngày Đến &Đi

Hãy xem xét những điều sau ...

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

Vì vậy, các CHỌN có thể trông giống như thế này ...

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

... nhưng bạn không cần phải kiểm tra chúng trước. Tôi đã cố tình viết các CHỌN theo cách mà việc kiểm tra có thể xảy ra như một phần của CHÈN ...

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

Trên thực tế, và tùy thuộc vào trải nghiệm người dùng mà bạn muốn cung cấp, bạn có thể muốn chạy CHỌN trước để người dùng có thể biết ngay những ngày nào không có sẵn, sau đó chạy CHÈN khi cần đặt chỗ - để đảm bảo rằng không ai nắm bắt được những ngày đó trong khi người dùng đang đặt trước giữa chừng.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Tạo chế độ xem trên các cơ sở dữ liệu khác nhau

  2. MySQL - Làm cho một trường hiện có trở thành duy nhất

  3. Trường AND NOT IN (NULL) trả về một tập hợp trống

  4. Cách truy cập đối tượng RowDataPacket

  5. Không thể thêm khóa ngoại trong MySQL 5.7 (Thiếu ràng buộc trong bảng được tham chiếu)