Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Jak wyznaczyć część wspólną dwóch zakresów?
Forum PHP.pl > Forum > Bazy danych > MySQL
nexis
Mam w bazie danych przedziały cenowe dla obiektów noclegowych, które wyglądają mniej więcej tak:

Hotel 1, 10-50 zł
Hotel 2, 40-120 zł
Hotel 3, 20-200 zł

W wyszukiwarce chcę również zastosować przedziały cenowe i moje pytanie brzmi:

jak skonstruować warunek, aby uwzględniał nawet najmniejszą część wspólną?

Chciałbym aby np. Hotel 1 został odnaleziony dla przedziałów:

a) 0-100
b) 30-40
c) 40-120
d) 10-20
vokiel
Najlepiej jakby ceny w bazie były zpisane w oddzielnych kolumnach: min, max
Wtedy zapytanie ograniczyłoby się do określenia minimum i maksimum zakresu:
a) SELECT ... WHERE min>= 0 or max<=100
b) SELECT ... WHERE min>= 30 or max<=40
c) SELECT ... WHERE min>= 40 or max<=120
e) SELECT ... WHERE min>= 10 or max<=20

Albo używając konstrukcji BETWEEN
Kasyx
Jeśli przedziały cenowe hotelu to hotel_max i hotel_min
A wyszukiwany przez użytkownika przedział to user_max i user_min

Wtedy warunek będzie bardzo prosty:
Kod
SELECT * FROM `hotele` WHERE user_min <= hotel_max AND user_max >= hotel_min


Sprawdzam w ten sposób czy przedziały nie są rozłączne. Jest poprawnie gdy:
minimum tego, co chce user jest jest mniejsze niż max cena hotelu ORAZ max tego co chce user jest większe od hotelowego minimum.
nexis
Cytat(vokiel @ 24.05.2009, 19:07:00 ) *
a) SELECT ... WHERE min>= 0 or max<=100
b) SELECT ... WHERE min>= 30 or max<=40
c) SELECT ... WHERE min>= 40 or max<=120
e) SELECT ... WHERE min>= 10 or max<=20

Takie zapytanie nie zadziała, bo zarówno dla 10 >= 30 oraz 50 <= 40 otrzymamy FAŁSZ, więc takich wyników nie zwróci.

Cytat(Kasyx @ 24.05.2009, 19:12:53 ) *
Wtedy warunek będzie bardzo prosty:
Kod
SELECT * FROM `hotele` WHERE user_min <= hotel_max AND user_max >= hotel_min

Wiedziałem, że okaże się to banałem, ale czasami człowiek po prostu nie może wpaść na coś sam. Dobrze, że są takie miejsca jak to forum. :)
kevinsz
Ja bym to zapisał jakoś tak smile.gif

  1. SELECT ... WHERE (hotel_min BETWEEN user_min AND user_max) OR (hotel_max BETWEEN user_min AND user_max) OR (user_max > hotel_max AND user_min < hotel_min)


Wtedy pokryte są chyba wszystkie możliwe sytuacje. Ostatni warunek kiedy przedział hotelu zawiera się w przedziale z wyszukiwarki
nexis
Cytat(kevinsz @ 24.05.2009, 20:00:05 ) *
Ja bym to zapisał jakoś tak smile.gif

  1. SELECT ... WHERE (hotel_min BETWEEN user_min AND user_max) OR (hotel_max BETWEEN user_min AND user_max) OR (user_max > hotel_max AND user_min < hotel_min)


Wtedy pokryte są chyba wszystkie możliwe sytuacje. Ostatni warunek kiedy przedział hotelu zawiera się w przedziale z wyszukiwarki

Ostatni warunek jest zbędny, a poza tym rozwiązanie podane przez ~Kasyx zdaje się być lepsze.
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.