Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [MySQL][PHP]Zapytanie do rezerwacji
Forum PHP.pl > Forum > Przedszkole
Dixu
Witam

Mam problem ze stworzeniem zapytania, posiadam dwie tabele:

rezerwacja
id_rezerwacji, id_klienta, id_pokoju, data_od, data_do

pokoj
id_pokoju, tytul, opis, cena

potrzebuje wyciągnąć wszystkie dane z tabeli Pokoj których id_pokoju nie znajduje się w tabeli Rezerwacja pomiędzy data_od oraz data_do. A mianowicie chodzi o to aby wynikiem zapytania były wolne pokoje w podanym przez użytkownika przedziale czasowym.

Wyszło mi coś takiego:

SELECT * from pokoje WHERE ID_pokoju <>(SELECT ID_pokoju, data_od, data_do FROM rezerwacja WHERE data_od="$data_od AND data_do=$data_do)

lecz niestety nie działa
Kshyhoo
Używaj szukajki.
Dixu
Dziękuję, przeczytałem temat przerobiłem zapytanie :

SELECT * FROM `pokoj` LEFT JOIN `rezerwacja` ON `ID_rezerwacji` = `ID_pokoju` WHERE (`data_od` BETWEEN '2013-12-28' AND '2013-12-30') OR (`data_do` BETWEEN '2013-12-28' AND '2013-12-30');

lecz wyświetla błąd:

Column 'ID_pokoju' in on clause is ambiguous
Turson
Czytać błędy umiesz?

  1. SELECT * FROM `pokoj` LEFT JOIN `rezerwacja` ON `ID_rezerwacji` = `pokoj.ID_pokoju` WHERE (`data_od` BETWEEN '2013-12-28' AND '2013-12-30') OR (`data_do` BETWEEN '2013-12-28' AND '2013-12-30');
Dixu
wszystko działa bardzo dziękuje za pomoc
Dixu
z góry przepraszam za zamieszanie, zapytanie działa lecz dla wyświetlenia zarezerwowanych pokoi, jak przerobić zapytanie aby wyciągało wszystkie dane z tabeli Pokoj których id_pokoju nie znajduje się w tabeli Rezerwacja pomiędzy data_od oraz data_do. A mianowicie chodzi o to aby wynikiem zapytania były wolne pokoje w podanym przez użytkownika przedziale czasowym.

to zapytanie pokazuje wolne pokoje, lecz jedynie wtedy gdy w dacie od do zarezerwowany jest jakiś pokój.

SELECT * FROM `pokoj` v LEFT JOIN `rezerwacja`a ON a.ID_pokoju != v.ID_pokoju WHERE (`data_od` BETWEEN '2013-12-24' AND '2013-12-27') OR (`data_do` BETWEEN '2013-12-24' AND '2013-12-27')

Kshyhoo
Skoro w Twoim zapytaniu a.ID_pokoju != v.ID_pokoju, to pomyśl...
Dixu
myślę cały czas, a.ID_rezerwacji != v.ID_pokoju pokazuje wszystkie pokoje także zarezerwowany
Kshyhoo
Pokaż, jak wygląda struktura bazy.
Passion guscho
baza danych posiada tabele:

rezerwacja
id_rezerwacji, id_klienta, id_pokoju, data_od, data_do

pokoj
id_pokoju, tytul, opis, cena

posiada również tabele:
firma, klienci, pracownicy

lecz chyba nie są one istotne dla skrypty
Kshyhoo
Skoro nie trzymasz w bazie, czy pokój jest zajęty czy wolny, to jedyną metodą pobrania wolnych pokoi jest pobranie różnych od zawierających się w data_od i data_do. Jeżeli nie ma daty, to znaczy, że jest wolny.
Dixu
wiem, napisałem w pierwszym poście to samo tylko innymi słowami i mam zapytanie które wyświetla ale pokoje zarezerwowane w danym terminie :

SELECT * FROM `pokoj` v LEFT JOIN `rezerwacja`a ON a.ID_pokoju = v.ID_pokoju WHERE (`data_od` BETWEEN '2013-12-24' AND '2013-12-27') OR (`data_do` BETWEEN '2013-12-24' AND '2013-12-27')

i tu moje pytanie, czy mógł byś je przerobić lub chociaż powiedzieć jak to zrobić tak aby robiły to co napisałeś w poście wyżej ? ponieważ nie mam zielonego pojęcia jak to zrobić a bardzo mi to potrzebne

z góry dziękuje.
Dixu
Lub może podpowiesz jak zmienić bazę danych aby można było to wykonać łatwiej.
Dixu
działa biggrin.gif, może komuś się kiedyś przyda:

SELECT * FROM `pokoj` v LEFT JOIN `rezerwacja`a ON a.ID_pokoju = v.ID_pokoju WHERE (`data_od` IS NULL OR `data_od` NOT BETWEEN '2013-12-24' AND '2013-12-27') OR (`data_do` IS NULL OR `data_do` NOT BETWEEN '2013-12-24' AND '2013-12-27')
Dixu
Zapytanie jednak nie działa tak jak bym chciał. Gdy pokój jest zarezerwowany tylko w jednym terminie zapytanie działa prawidłowo, lecz gdy jeden pokój zarezerwowany jest w kilku terminach zostaje on wyświetlany kilkukrotnie.

  1. SELECT * FROM `pokoj` v LEFT JOIN `rezerwacja`a ON a.ID_pokoj = v.ID_pokoju WHERE (`data_od` IS NULL OR `data_do` NOT BETWEEN '2014-01-08 14:00' AND '2014-01-09 12:00' AND `data_od` NOT BETWEEN '2014-01-08 14:00' AND '2014-01-09 12:00')


jest to spowodowane tym że zapytanie wyciąga wszystkie pokoje które nie są pomiędzy podanymi datami, lecz jeśli pokój jest zarezerwowany w innym terminie to mimo tego jest wyświetlany. Jak zmodyfikować zapytanie aby wyświetlało pokoje które w podanym przedziale czasowym nie są zarezerwowane.

Bardzo proszę o pomoc przeszukałem wiele tematów i nigdzie nie znalazłem rozwiązania
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.