Mysql
 sql >> Baza danych >  >> RDS >> Mysql

Wybierz dostępne pokoje między dwoma terminami

Trudno tutaj znaleźć dla Ciebie kompletną odpowiedź, ponieważ pokazujesz nam tylko tabelę zawierającą rezerwacje - nie wiemy, jaki zakres pokoi jest dostępny.

SQL, który zwraca room_id dla pokoi, które są zarezerwowane przynajmniej przez część wybranego okresu, może wyglądać tak:

SELECT `room_id` , COUNT(*)
FROM `bookings`
WHERE `dt` BETWEEN "[start date]" AND "[end date]"
GROUP BY `room_id`;

Gdybyś miał tabelę pokoi (zamiast rezerwacji), możliwe byłoby zwrócenie listy wszystkich pokoi nie zarezerwowanych w tym okresie za pomocą:

SELECT `id`
FROM `rooms`
WHERE `id` NOT IN (
  SELECT DISTINCT( `room_id` )
  FROM `bookings`
  WHERE `dt` BETWEEN "[start date]" AND "[end date]"
);

ZMIANA

Na podstawie opinii OP, założenia są teraz następujące:

  • Tabela zawiera szczegółowe informacje o pokojach, które są dostępne w okresie rozpoczynającym się w dniu w kolumnie dt i kończące się następnego dnia (tj. pokoje hotelowe)
  • Zapytanie powinno zwrócić wszystkie pokoje, które są dostępne przez cały wprowadzony okres (więc zwrócone zostaną tylko pokoje, które są dostępne od DNIA A do DNIA B).

W związku z tym zmieniony kod to:

SELECT room_id
FROM available_rooms
WHERE dt BETWEEN "[start date]" AND DATE_SUB("[end date]",INTERVAL 1 DAY)
GROUP BY room_id
HAVING COUNT(*)=ABS(DATEDIFF("[start date]","[end date]"));


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Jak przechowywać plik java.util.Date w polu znacznika czasu MySQL w strefie czasowej UTC/GMT?

  2. Jak używać indeksów do poprawy wydajności zapytań MySQL

  3. Facebook PHP SDK - Przechowuj dane użytkownika w bazie danych MYSql

  4. Jak działa funkcja LPAD() w MySQL

  5. ponowne użycie aliasu w SELECT