1) hotels: ID, name
2) floors: hotels_ID_FK, floor_number
3) rooms: floors_ID_FK, space
4) addreses: hotels_ID_FK, city, street, house_number
Każdy z hoteli może mieć wiele pięter i wiele pokojów na każdym piętrze.
Każdy z hoteli może mieć też więcej niż jeden adres np. przy ulicy Kolejowej i Dworcowej jeśli leży na skrzyżowaniu ulic (nie jest to typowa interpretacja adresu).
SELECT ID, name, sum(space) AS hotel_space FROM hotels AS h JOIN addreses AS a ON (a.hotels_ID_FK = h.ID) JOIN floors AS f ON (f.hotels_ID_FK = h.ID) JOIN rooms AS r ON (r.floors_ID_FK = f.ID) WHERE a.city LIKE 'Sopot' AND a.street LIKE 'Dworcowa' GROUP BY h.ID HAVING hotel_space > 100;
Zapytanie powinno zwracać listę hoteli w Sopocie przy ulicy Dworcowej i sumę powierzchni pokojów w każdym z hoteli.
Jeśli suma powierzchni pokoi w hotelu jest mniejsza od 100 m hotel nie powinien znaleźć się w wynikach wyszukiwania.
Problem pojawia się, gdy hotel ma więcej niż jeden adres - w takim przypadku suma jest zawyżona i co za tym idzie konstrukcja HAVING działa nie poprawnie.
Jak poprawić zapytanie aby grupowanie w każdym przypadku działało poprawnie?
I kolejne pytanie:
Jeśli do powyższego zapytania dodamy warunki
WHERE f.floor_number > 3 AND f.floor_number < 10
(interesują nas tylko hotele o powierzchni powyżej 100 m zlokalizowanej pomiędzy piętrami 3 i 10)
w jaki sposób wybrać tylko te hotele w przypadku których powierzchnia znajduje się tylko na piętrach sąsiadujących tzn. np.
piętro 4: 50 m
piętro 5: 25 m
piętro 6: 26 m
a nie:
piętro 4: 50 m
piętro 7: 60 m
?