2012-01-18 8 views
6

Chcę zbudować system rezerwacji hoteli. Dla tego systemu; Baza danych jest również stosowany fro innego programu ... ale mam problem: zanim rezerwacji chcę zobaczyć, które Ilość pokoi typu są dostępne dla mojego dla mojej rezerwacji ..Zapytanie Sql o kwerendę do systemu rezerwacji hotelu?

Moja tabela tworzyć sql querys

CREATE TABLE oteldb.oda (
oda_id INT (11) NOT NULL auto_increment, 
oda_tip_id INT (11) DEFAULT NULL, 
oda_adi VARCHAR (20) DEFAULT NULL, 
PRIMARY KEY (oda_id) 
) 
ENGINE = MyISAM 
AUTO_INCREMENT = 1 
CHARACTER SET utf8 
COLLATE utf8_general_ci; 

CREATE TABLE oteldb.tip (
tip_id INT (11) NOT NULL auto_increment, 
tip_adi VARCHAR (20) DEFAULT NULL, 
PRIMARY KEY (tip_id) 
) 
ENGINE = MyISAM 
AUTO_INCREMENT = 1 
CHARACTER SET utf8 
COLLATE utf8_general_ci 
ROW_FORMAT = FIXED; 

CREATE TABLE oteldb.rezervasyon (
rezervasyon_id INT (11) NOT NULL auto_increment, 
rezervasyon_gt DATE DEFAULT NULL, 
rezervasyon_ct DATE DEFAULT NULL, 
rezervasyon_oda_id INT (11) DEFAULT NULL, 
PRIMARY KEY (rezervasyon_id) 
) 
ENGINE = MyISAM 
AUTO_INCREMENT = 1 
CHARACTER SET utf8 
COLLATE utf8_general_ci; 

ja spróbuj tego, ale nie działa

SELECT 
* 
FROM 
oteldb.tip 
WHERE 
IN tip.tip_id 
(SELECT 
oteldb.oda.oda_tip_id 
FROM 
oteldb.oda 
WHERE 
IN oda.oda_id note 

(SELECT 
oteldb.rezervasyon.rezervasyon_oda_id 
FROM 
oteldb.rezervasyon 
WHERE 
"2012-01-03" BETWEEN AND rezervasyon_ct rezervasyon_gt 
AND "2012-01-22" AND BETWEEN rezervasyon_gt rezervasyon_ct)) 

dzięki teraz ...

+0

'gdzie w tip.tip_id' powinno być' GDZIE tip.tip_id IN ' –

+2

+1 za dołączenie DDL. –

+0

thanx Florin Ghita i Mark Bannister, próbowałem, ale wynik nie jest prawdziwy, również nie można wyświetlić liczby pokoi. i tihnk moje zapytanie jest błędne ... – Mehmet

Odpowiedz

2

Zakładając, że wolne miejsca są te, które nie są już zastrzeżone w dowolnym momencie w okresie zapytań, a rezervasyon_gt i rezervasyon_ct są odpowiednio daty zakończenia początek rezerwacji i, spróbuj:

select t.tip_adi, count(oda.oda_tip_id) 
from oteldb.tip t 
left join (select oda_tip_id 
      from oteldb.oda o 
      where not exists 
       (select null 
       from oteldb.rezervasyon r 
       where r.rezervasyon_oda_id = o.oda_id and 
         r.rezervasyon_gt <= '2012-01-22' and 
         '2012-01-03' <= r.rezervasyon_ct) 
      ) oda on oda.oda_tip_id = t.tip_id 
group by t.tip_adi 
+0

Dzięki Mark zapytanie jest nieprawidłowe. Moja struktura bazy danych i zapytanie sql danych następuje. Z góry dziękuję. [Sql Create Query] (http://verigrup.net/oteldb.txt) Przekonwertowałem angielski – Mehmet

+1

@Mehmet: Korzystając z danych testowych, próbowałem uruchomić moje zapytanie lokalnie i zdałem sobie sprawę, że powinien wybrać "count (oda.oda_tip_id)", a nie "count (*)". Poprawiłem moje zapytanie - poprawione zapytanie wydaje się działać poprawnie z danymi testowymi. –

+0

Dzięki Mark, ponownie wypróbowałem zapytanie, ale pokazałem również zarezerwowane pokoje w zadanym dniu. Wysyłam Ci link do wykresu sql w języku angielskim [tabela sql] (http://verigrup.net/hotel.txt). Na przykład istnieje pokój pięcioosobowy od 2012,01,03 do 2012.01.22. nie powinien pokazywać zajętego pokoju w tym "typie" na liście "typ". to znaczy, jeśli 5 z 8 pokoi jest zajętych w "type_id" = 1, powinno to obejmować 3 pokoje, które mają "typ_id" = 1. – Mehmet

0
select 
     RoomType.tip_adi, 
     sum(if(Rooms.oda_id = BookedRooms.rezervasyon_oda_id, 0, 1) as AvailableCount 
    from 
     oteldb.oda Rooms 

     LEFT JOIN (select distinct 
          res.rezervasyon_oda_id 
         from 
          oteldb.rezervasyo res 
         where 
           res.rezervasyon_gt between '2012-01-22' and '2012-01-03' 
          OR res.rezervasyon_ct between '2012-01-22' and '2012-01-03' 
        ) BookedRooms 
      on Rooms.oda_id = BookedRooms.rezervasyon_oda_id 

     JOIN oteldb.tip RoomType 
      on Rooms.oda_tip_id = RoomType.tip_id 
+0

DRapp Dzięki, literówka w zapytaniu. :/ 1 Występuje błąd w składni SQL; sprawdź instrukcję, która odpowiada twojej wersji serwera MySQL dla właściwej składni do użycia w pobliżu '(if (Rooms.oda_id = BookedRooms.rezervasyon_oda_id, 0, 1)) jako AvailableCount,' w linii 3 Query1.qry 3 7 – Mehmet

+0

@ Mehmet, zmiana z IF (warunek, odpowiedź prawdziwa, odpowiedź fałszywa) na warunek Case/When. – DRapp

+0

:/1 Masz błąd w składni SQL; sprawdź instrukcję, która odpowiada twojej wersji serwera MySQL dla właściwej składni do użycia w pobliżu sumy (przypadek, gdy Rooms.oda_id = BookedRooms.rezervasyon_oda_id th 'w linii 1 Query1.qry 1 37 – Mehmet