Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Skrypt piłkarski
Forum PHP.pl > Forum > Bazy danych > MySQL
Igor
Skrypt piłkarski

Witam, stworzyłem stronę gdzie umieszczam wiele rozgrywek piłkarskich. Strona oparta jest na bazie danych mysql. Tabela z meczami 'liga' ma następującą strukturę:

id | id_ligi| id_gospodarze | id_goscie | wynik_gospodarze | wynik_goscie | zw_gospodarze | por_gospodarze | remis_gospodarze | remis _goscie | por_gospodarze | por_goscie

gdzie w odpowiednich polach od zw_gospodarze do por_goscie znajdują się id_klubów (lub 0)

Np.
id_gospoadarze 100
id_goscie 200
wynik_gospodarze 2
wynik_goscie 1
zw_gospodarze 100
por_gospodarze 0
remis_gospodarze 0
remis _goscie 0
por_gospodarze 0
por_goscie 200

oznacze że drużyna o id 100 wygrała z drużyną o id 200 2-1

I teraz chodzi o wygenerowanie tabeli dla tak zapisanych danych. Zrobiłem to w ten sposób, że najpierw wybieram drużyny, po czym dla każdej drużyny tworzę zapytania licząc ich poszczególne zwyciestwa, remisy, porazki i bramki. Dla 1 druzyny daje to 7 zapytań. Wszystko jest w porządku, tylko że już przy kilkudziesięciu ligach (czyli kilka tysięcy meczów) zauważalny gołym okiem jest wydłużony czas dla takiej operacji. Np. dla ligi 18-zespołowej czas wykonania takiego skryptu wynosi ponad 6 sekund.. Wciąż dodaję nowe rozgrywki i takie rozwiązanie w dalszej perspektywie wydaje się bezsensowne. I tutaj moje pytanie: Czy można ten problem rozwiązać w prostszy i szybszy sposób?

Poniżej mój kod generujący i zapisujący tabele.


  1. <?php
  2. $druzyny = mysql_query("SELECT DISTINCT id_gospodarze FROM liga WHERE id_ligi='$_GET[id]'") or die(error);
  3.  
  4. for ($i=1;$i<=mysql_num_rows($druzyny);$i++){
  5. $team=mysql_fetch_array($druzyny);
  6. $druzyna=$team[id_gospodarze];
  7.  
  8.  
  9. #  zw, rem, por 
  10.  
  11. $zap1=mysql_fetch_array(mysql_query("SELECT count(id) as suma from liga WHERE id_ligi='$id' AND (zw_gospodarze='$druzyna' OR zw_goscie='$druzyna')"));
  12. $zwyciestwa=$zap1[suma];
  13.  
  14. $zap2=mysql_fetch_array(mysql_query("SELECT count(id) as suma from liga WHERE id_ligi='$id' AND (remis_gospodarze='$druzyna' OR remis_goscie='$druzyna')"));
  15. $remisy=$zap2[suma];
  16.  
  17. $zap3=mysql_fetch_array(mysql_query("SELECT count(id) as suma from liga WHERE id_ligi='$id' AND (por_gospodarze='$druzyna' OR por_goscie='$druzyna')"));
  18. $porazki=$zap3[suma];
  19.  
  20. # bramki strzelone
  21. $zap4=mysql_fetch_array(mysql_query("SELECT SUM(wynik_gospodarze) as suma1 from liga WHERE id_ligi='$id'  AND id_gospodarze='$druzyna'"));
  22. $zap5=mysql_fetch_array(mysql_query("SELECT SUM(wynik_goscie) as suma2 from liga WHERE id_ligi='$id'  AND id_goscie='$druzyna'"));
  23.  
  24. $strzelone=$zap4[suma1]+$zap5[suma2];
  25.  
  26. # bramki stracone
  27. $zap6=mysql_fetch_array(mysql_query("SELECT SUM(wynik_gospodarze) as suma3 from liga WHERE id_ligi='$id'  AND id_goscie='$druzyna'"));
  28. $zap7=mysql_fetch_array(mysql_query("SELECT SUM(wynik_goscie) as suma4 from liga WHERE id_ligi='$id'  AND id_gospodarze='$druzyna'"));
  29. $stracone=$zap6[suma3]+$zap7[suma4];
  30. #####################################
  31.  
  32. $mecze=$zwyciestwa+$remisy+$porazki;
  33. $punkty=$zwyciestwa*+ $remisy;
  34.  
  35. mysql_query("UPDATE tabele SET druzyna='$druzyna', mecze='$mecze', punkty='$punkty', zwyciestwa='$zwyciestwa', remisy='$remisy', porazki='$porazki', strzelone='$strzelone', stracone='$stracone' WHERE id_ligi='$_GET[id]' AND miejsce='$i'"); #zapisywanie druzyn do tabeli 
  36. }
  37.  
  38.  
  39. #petla 2
  40. $tab=mysql_query("SELECT * from tabele where id_ligi='$_GET[id]' ORDER by punkty DESC,(strzelone-stracone) DESC, strzelone DESC, stracone ASC");
  41. for ($j=1;$j<=mysql_num_rows($druzyny);$j++){
  42.  
  43. #sortuje i zapisuje druzyny w tabeli w odpowiedniej kolejnosci
  44. mysql_query("UPDATE tabele SET druzyna='$dr[druzyna]', mecze='$dr[mecze]', punkty='$dr[punkty]', zwyciestwa='$dr[zwyciestwa]', remisy='$dr[remisy]', porazki='$dr[porazki]', strzelone='$dr[strzelone]', stracone='$dr[stracone]' WHERE id_ligi='$_GET[id]' AND miejsce='$j'");
  45.  
  46. }
  47. ?>


---
nospor
SongoQ
Hehehe przeciez to logiczn, zobacz ile masz odwolan do bazy, mniej odwolan mniejszy czas. Zastanow sie i przenies to na serwer baz danych a nie na php. Zamiast tylu zapytan mozesz wykonac 1 ktoro bedzie efektywniejsze.
Igor
Na pewno jest prostsze rozwiązanie jednak jestem początkujący w dziedzinie baz danych dlatego prosiłbym o bliższe wskazówki. Z góry dziękuje smile.gif
shield
a nie prosciej update'owac tabele tylko wtedy gdy dodajesz wynik? wpisujesz na przyklad 2:1 dla gospodarzy, dodajesz do punktow 3, do meczow 1, do bramek strzelonych 2 itd. po co obliczac jeszcze raz wszystkie mecze i punkty?

poza tym na pewno zmienilbym strukture tabeli liga, w koncu wystarczy id, id gospodarza, id goscia i wynik. a kto wygral, czy zremisowal mozna sobie po wyniku sprawdzic. to pierwsze co mi przychodzi na mysl

greets
Igor
shield - Twoje rozwiązanie nie wchodzi w grę. Ja cały terminarz tworzę już przy dodawaniu ligi, a później już tylko edytuje poszczególne kolejki. Co np, jeśli wynik będzię błędny lub, co częściej się zdarza padnie walkower? Struktury tabeli także nie będę zmieniał. Szukam po prostu optymalniejszego rozwiązania od mojego...
SongoQ
Trzymal bym sie wersji @shield, w bazach danych trzyma sie dane do wyliczen a nie wyloczone, zawsze mozesz sobie poprzeliczac, w tym przypadku beda proste regulki. A co do tych walkowerow itd, to dodatkowa tabele z wynikiem i typem wyniku z powiazaniem z zespolami. To co pisal @shield tylko bardziej rozbudowane.
yavaho
Ostatnio przerabialem pewna stronke wlasnie aby mozna bylo na niej wyswietlac te wszystkie tabele rozgrywki punkty itp. Z tym ze baze danych zrobilem od podstaw. Strona nie jest duza ale baza danych przygotowana jest chyba przyjac wszystkie druzyny w Polsce. stronka
Takie mam tabele:
Sezon
Grupa(liga)
Zespol
Kolejka(data meczu)
Mecze

Z tabeli Mecze obliczane sa wszystkie punkty. W tabeli sa takie rekordy:
ID_sezon
ID_grupa
ID_kolejka
ID_gospoadarze
ID_goscie
wynik_gospodarze
wynik_goscie

Do obliczenia jednej tabeli ktora wyswietla punktacje mam tylko dwa zapytania do bazy. Jedno - pobieram z bazy danych okolo 60-100 meczy z danej grupy. Drugie - pobieram nazwy druzyn. I nie mam petli, tylko dwa zapytania do bazy - wiec to chyba nie jest duzo. Potem reszta obliczen juz jest zrobiona w tabeli w php.
Na razie dziala bardzo szybko biorac pod uwage ze sortowanie punktacji jest nieco zawiłe w przypadku gdy trzeba obliczac mecze bezposrednie.

Musisz stanowczo zmniejszyc ilosc zapytan do bazy. Albo generowac gotowa tablice lub plik z tymi wynikami tylko wtedy gdy admin edytuje dane (gdy wprowadza mecze, wyniki itp) Klient ogladajacy strone nie bedzie wtedy uruchamial calego tego skryptu generujacego wyniki tylko bedzie pobieral gotowa obliczona tabele z bazy danych lub pliku.

ps
Jak masz zrobione sortowanie gdy druzyny maja po tyle samo pkt ? I wtedy trzeba brac pod uwage tylko ich mecze bezposrednie?
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.