Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> Jak wyznaczyć część wspólną dwóch zakresów?
nexis
post 24.05.2009, 17:55:37
Post #1





Grupa: Zarejestrowani
Postów: 1 012
Pomógł: 109
Dołączył: 26.09.2003
Skąd: nexis.pl

Ostrzeżenie: (0%)
-----


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

Ten post edytował nexis 24.05.2009, 17:57:17


--------------------
Zend Certified Engineer

Kliknij POMÓGŁ jeśli moja odpowiedź okazała się użyteczna!
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi (1 - 5)
vokiel
post 24.05.2009, 18:07:00
Post #2





Grupa: Zarejestrowani
Postów: 2 592
Pomógł: 445
Dołączył: 12.03.2007

Ostrzeżenie: (0%)
-----


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


--------------------
Go to the top of the page
+Quote Post
Kasyx
post 24.05.2009, 18:12:53
Post #3





Grupa: Zarejestrowani
Postów: 45
Pomógł: 7
Dołączył: 29.04.2009
Skąd: Kraków

Ostrzeżenie: (0%)
-----


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.
Go to the top of the page
+Quote Post
nexis
post 24.05.2009, 18:46:43
Post #4





Grupa: Zarejestrowani
Postów: 1 012
Pomógł: 109
Dołączył: 26.09.2003
Skąd: nexis.pl

Ostrzeżenie: (0%)
-----


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

Ten post edytował nexis 24.05.2009, 18:36:32


--------------------
Zend Certified Engineer

Kliknij POMÓGŁ jeśli moja odpowiedź okazała się użyteczna!
Go to the top of the page
+Quote Post
kevinsz
post 24.05.2009, 19:00:05
Post #5





Grupa: Zarejestrowani
Postów: 23
Pomógł: 2
Dołączył: 26.04.2007

Ostrzeżenie: (0%)
-----


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
Go to the top of the page
+Quote Post
nexis
post 24.05.2009, 20:50:05
Post #6





Grupa: Zarejestrowani
Postów: 1 012
Pomógł: 109
Dołączył: 26.09.2003
Skąd: nexis.pl

Ostrzeżenie: (0%)
-----


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.


--------------------
Zend Certified Engineer

Kliknij POMÓGŁ jeśli moja odpowiedź okazała się użyteczna!
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
2 Użytkowników czyta ten temat (2 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Wersja Lo-Fi Aktualny czas: 25.07.2025 - 01:06