Dixu
22.12.2013, 16:19:39
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
22.12.2013, 17:48:52
Dixu
22.12.2013, 18:18:02
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
22.12.2013, 18:33:48
Czytać błędy umiesz?
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
22.12.2013, 18:35:53
wszystko działa bardzo dziękuje za pomoc
Dixu
22.12.2013, 19:52:38
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
22.12.2013, 20:06:38
Skoro w Twoim zapytaniu a.ID_pokoju != v.ID_pokoju, to pomyśl...
Dixu
22.12.2013, 20:16:34
myślę cały czas, a.ID_rezerwacji != v.ID_pokoju pokazuje wszystkie pokoje także zarezerwowany
Kshyhoo
22.12.2013, 20:39:55
Pokaż, jak wygląda struktura bazy.
Passion guscho
22.12.2013, 20:46:29
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
22.12.2013, 20:53:14
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
22.12.2013, 20:57:52
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
22.12.2013, 21:38:09
Lub może podpowiesz jak zmienić bazę danych aby można było to wykonać łatwiej.
Dixu
22.12.2013, 21:50:58
działa

, 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')
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.
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.