![]() |
![]() |
![]() ![]()
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 -------------------- |
|
|
![]() |
![]()
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 -------------------- |
|
|
![]()
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. |
|
|
![]()
Post
#4
|
|
![]() Grupa: Zarejestrowani Postów: 1 012 Pomógł: 109 Dołączył: 26.09.2003 Skąd: nexis.pl Ostrzeżenie: (0%) ![]() ![]() |
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. 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 -------------------- |
|
|
![]()
Post
#5
|
|
![]() Grupa: Zarejestrowani Postów: 23 Pomógł: 2 Dołączył: 26.04.2007 Ostrzeżenie: (0%) ![]() ![]() |
Ja bym to zapisał jakoś tak
![]()
Wtedy pokryte są chyba wszystkie możliwe sytuacje. Ostatni warunek kiedy przedział hotelu zawiera się w przedziale z wyszukiwarki |
|
|
![]()
Post
#6
|
|
![]() Grupa: Zarejestrowani Postów: 1 012 Pomógł: 109 Dołączył: 26.09.2003 Skąd: nexis.pl Ostrzeżenie: (0%) ![]() ![]() |
Ja bym to zapisał jakoś tak ![]()
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. -------------------- |
|
|
![]() ![]() |
![]() |
Wersja Lo-Fi | Aktualny czas: 25.07.2025 - 01:06 |