Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Problem z GROUP BY i HAVING
Forum PHP.pl > Forum > Bazy danych > MySQL
LBula
Mamy tabelki:

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

  1. SELECT ID, name, sum(space) AS hotel_space FROM hotels AS h
  2. JOIN addreses AS a ON (a.hotels_ID_FK = h.ID)
  3. JOIN floors AS f ON (f.hotels_ID_FK = h.ID)
  4. JOIN rooms AS r ON (r.floors_ID_FK = f.ID)
  5. WHERE a.city LIKE 'Sopot' AND a.street LIKE 'Dworcowa'
  6. GROUP BY h.ID
  7. 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

  1. 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

?
uupah5
Cytat(LBula @ 19.06.2011, 17:32:49 ) *
Jak poprawić zapytanie aby grupowanie w każdym przypadku działało poprawnie?

subquery zwracające id hoteli wg zadanych warunków na adres
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-2024 Invision Power Services, Inc.