Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> [MySQL]Czy jest takie zapytanie?
MateuszS
post 20.10.2014, 14:15:23
Post #1





Grupa: Zarejestrowani
Postów: 1 429
Pomógł: 195
Dołączył: 6.10.2008
Skąd: Kraków/Tomaszów Lubelski

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


Witam. Mam takie 3 tabele (mniej wiecej):

groups: ID, name
reservations: ID, id_group, status
reserved: ID, id_reservation, id_resource, id_category, date_start, date_end

Grupy moga rezerwowac jakis zasób (resource) z jakiejs kategorii. Moze byc taka sytuacja (ale nie musi i zbyt często nie będzie) ze w pewnym okresie czasu jakies dwie (lub wiecej) grup rezerwuja ten sam zasób z tej samej kategorii. Wtedy się nim dzielą. Szukam zapytania, które wybrałoby mi te dwie grupy oraz dzień od którego zaczyna się to współdzielenie zasobu. Wynik zapytania powinien wyglądać mniej więcej tak:

[group 1, group 2, date] (data od której zaczyna się współdzielenie)

Przykład:

groups:
5, Grupa A
6, Grupa B

reservations:
1, 5, accepted
2, 6, accepted

reserved:
1, 1, 15, 10, 2014-10-25, 2014-10-30
2, 2, 15, 10, 2014-10-23, 2014-11-02


zapytanie powinno zwrócić
5, 6, 2014-10-25 (bo jest to data od której obie rezerwacje się na siebie nakładają)

Zapytanie powinno ignorować sytuacje gdy jedna grupa zdubluje rezerwacje (czyli grupa 1 != grupa 2)

Ma ktoś jakiś pomysł? Zależy mi na tym zeby to bylo zrobione po stronie MYSQLa

Ten post edytował MateuszS 20.10.2014, 14:17:16


--------------------
O! Zimniok :P
Go to the top of the page
+Quote Post
sowiq
post 20.10.2014, 14:34:07
Post #2





Grupa: Zarejestrowani
Postów: 1 890
Pomógł: 339
Dołączył: 14.12.2006
Skąd: Warszawa

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


Przecież wystarczy zrobić odpowiedni warunek i później go zapisać w MySQL. Czyli:

1. ID rezerwacji kategorii jest takie samo (id1 = id2)
2. ID zasobu jest takie samo (res_id1 = res_id2)
3. Daty się pokrywają, czyli początek lub koniec pierwszego okresu zawiera się w drugim okresie (date1_start BETWEEN date2_start AND date2_end OR date1_end BETWEEN date2_start AND date2_end)
4. Są to różne rezerwacje (id1 != id2)

I cała filozofia wink.gif

Ten post edytował sowiq 20.10.2014, 14:38:57
Go to the top of the page
+Quote Post
MateuszS
post 20.10.2014, 14:58:17
Post #3





Grupa: Zarejestrowani
Postów: 1 429
Pomógł: 195
Dołączył: 6.10.2008
Skąd: Kraków/Tomaszów Lubelski

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


@sowiq, to nie takie proste smile.gif Zapytanie sklecone z Twojego pomysłu (w sumie coś podobnego robiłem wcześniej) wyrzuca dużo rekordów (niektóre się powtarzają tylko zamienione są miejscami zjoinowane tabele). Na dodatek wydaje mi sie ze pomysl jest lekko chybiony

  1. SELECT *
  2. FROM reserved t1
  3. JOIN reserved t2
  4. ON t1.date_start BETWEEN t2.date_start AND t2.date_end OR t1.date_end BETWEEN t2.date_start AND t2.date_end
  5. WHERE t1.id_resource = t2.id_resource AND t1.id_resource = t2.id_resource AND t1.id_reservation <> t2.id_reservation


Ten post edytował MateuszS 20.10.2014, 14:59:46


--------------------
O! Zimniok :P
Go to the top of the page
+Quote Post
sowiq
post 20.10.2014, 15:05:01
Post #4





Grupa: Zarejestrowani
Postów: 1 890
Pomógł: 339
Dołączył: 14.12.2006
Skąd: Warszawa

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


Nie pomysł jest chybiony, tylko dajesz za mało warunków smile.gif Przede wszystkim chcesz, żeby każda znaleziona para występowała tylko raz. Więc musisz dodać/zmienić warunek, np. t1.id_reservation < t2.id_reservation. Banalna zmiana, a rozwiązuje pierwszy problem smile.gif

Ale nic na siłę. Zawsze możesz poszukać innego rozwiązania.

[edit]
I zdecydowanie zamieniłbym miejscami warunki w ON oraz WHERE. Na logikę - najpierw łączysz rekordy (po odpowiednich kluczach obcych), a później wybierasz te spełniające Twoje warunki. A nie odwrotnie.

Ten post edytował sowiq 20.10.2014, 15:15:16
Go to the top of the page
+Quote Post
MateuszS
post 20.10.2014, 15:46:26
Post #5





Grupa: Zarejestrowani
Postów: 1 429
Pomógł: 195
Dołączył: 6.10.2008
Skąd: Kraków/Tomaszów Lubelski

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


No z tym t1.id_reservation < t2.id_reservation to w życiu bym na to nie wpadł biggrin.gif

Ok, myślę że już dalej sobie poradzę jakoś. Dzięki wielkie za pomoc,

+ leci


--------------------
O! Zimniok :P
Go to the top of the page
+Quote Post

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

 



RSS Wersja Lo-Fi Aktualny czas: 25.04.2024 - 03:14