![]() |
![]() ![]() |
![]() |
![]()
Post
#1
|
|
![]() Grupa: Zarejestrowani Postów: 711 Pomógł: 127 Dołączył: 5.07.2008 Skąd: Łódź Ostrzeżenie: (0%) ![]() ![]() |
Witam, zrobiłem sobie skrypt dzienniczka ucznia. Zasady działania nie muszę za pewne tłumaczyć
![]() Mam 2 tabele w mysql: ![]() ![]() Skliciłem taki oto skrypt:
co dało taki rezultat (taki jak ma być) ![]() Jak zauważyliście skrypt ten pobiera najpierw listę przedmiotów i podczas każdego przebiegu pętli jest wykonywane zapytanie o oceny do tego przedmiotu... Nie wydaje się wam się też że to jest nieoptymalne? Jak pobrać to wszystko bez zawierania w pętlach zapytań do sql? |
|
|
![]()
Post
#2
|
|
Grupa: Zarejestrowani Postów: 1 332 Pomógł: 294 Dołączył: 12.10.2008 Skąd: Olkusz Ostrzeżenie: (0%) ![]() ![]() |
jeszcze jedno zauważyłem że "dokładasz" do ocen - wyświetlając w pętli to zapytanie zrób sobie przed petlą jakąś zmienną i w pętli sprawdzaj czy jej wartość jest różna od id_przedmiotu - jesli różna wyświetlisz cały wiersz, jeśli taka sama to pomiń prawie cały rekord i dopisz ocenę - po tym na koniec pętli przypisz wartość tej zmiennej co porównujesz wartość id_przedmiotu.... mam na myśli taką sytuację zwróconą z bazy: Kod przedm_id ||przedm_nazwa || ocena_stopien || ocena_waznosc 1 || j.pol || 10/20 || 1 1 || j.pol || 3 || 2 2 || j.ang || 5 || 2 lub w 2 zapytaniach prawie tak jak zrobiłeś tyle że pobież odrazu pełne tabele te co potrzebujesz i przyrównaj to w php gdyż odwołanie w pętli do bazy nie jest najlepszym pomysłem... Ten post edytował zegarek84 17.01.2009, 06:21:52 -------------------- Jeśli twoja ręka rusza do przodu powstrzymaj swój gniew; gdy wyprzedza cię twój gniew - wycofaj rękę.
|
|
|
![]()
Post
#3
|
|
![]() Grupa: Zarejestrowani Postów: 711 Pomógł: 127 Dołączył: 5.07.2008 Skąd: Łódź Ostrzeżenie: (0%) ![]() ![]() |
Ten 2 sposób wydaje się chyba sensowniejszy.
Czyli najpierw wykonuję zapytanie sql_oceny
Przekazuję wynik do tablicy $oceny
Otrzymam taką zawartość tablicy $oceny:
A potem pobieram listę przedmiotów z bazy i przy każdym przebiegu pętli, zamiast dawać kolejne zapytanie do mysql, filtruję tablicę $oceny za pomocą pętli foreach:
Dobrze zrozumiałem? Czy to jest wydajniejsze niż dawanie zapytań przy każdym przedmiocie? Ta tablica $oceny z czasem może stać się większa... Ten post edytował cycofiasz 17.01.2009, 11:03:21 |
|
|
![]()
Post
#4
|
|
Grupa: Zarejestrowani Postów: 1 332 Pomógł: 294 Dołączył: 12.10.2008 Skąd: Olkusz Ostrzeżenie: (0%) ![]() ![]() |
sory że tak puźno odpisuję ale dopiero dziś znalazłem czas (w końcu po zaliczeniach ^^)
Dobrze zrozumiałem? Czy to jest wydajniejsze niż dawanie zapytań przy każdym przedmiocie? Ta tablica $oceny z czasem może stać się większa... to i tak bedzie wydajniejsze od zapytań w pętli do bazy myql - choć bawiąc się bazą sqlite i używając sesji miałbyś podobny efekt ![]() ja proponuje dane które "sciągasz" z bazy danych zapisywać do tablicy wielo wymiarowej mniej więcej o takiej konstrukcji: Kod Array ( [$id_przedm] => Array ( [nazwa_id_przedm] => j.pol [ocena] => Array ( [0] => Array ( [stopien] => 2 [warznosc] => 1 ) [1] => Array ( [stopien] => 3 [warznosc] => 2 ) ) ) ) głównie dlatego żeby nie przeszukiwać w pętli całej tablicy ocen tylko jakby to posortować.... z kolei jesli tych ocen miało by być multum (za bardzo obciążające pamięć przez operacje na tablicach) to mógłbyś w pętli pobierać większą liczbę tych ocen sortując po id_przedmiotu i korzystając z LIMIT w zapytaniu a potem następna działkę do tablicy pamiętając o zwolnieniu pamięci tego co już się "zoperowało" czyli kasowaniu fragmentów starej tablicy przez urzycie funkcji unset()... pobieranie każdej oceny w petli z bazy to trochu by to spowolniło wszystko (w ostatecznosci jeśli aż tak dużo ocen to porcjami - choć wątpię by było aż tak dużo) i operacja jak już wspomniałem na tablicach - ale jednak pasuje przypisać i operować na tablicy wielowymiarowej żeby nie "przelatywać i sprawdzać" w pętli za każdym razem tych ocen - poprostu posortować podczas wpisów do tablicy i operować jakby to nazwać na "podtablicach"... jeszcze raz przepraszam że tak puźno odpisuję i o ile to przeczytasz mam nadzieje że zrozumialeś - przegladam tematy w których się wypowiadam więc jeśli coś napiszesz to za jakiś czas znowu tu zajrzę ![]() PS. przez $id_przedm mam na myśli te cyferki dla przedmiotu (można by w sumie dac inna konstrukcję i odrazu nazwę przedmiotu tutaj zamiast wewnątrz tego fragmentu tablicy ale jak już kto woli ![]() ![]() Kod Array
( [1] => Array ( [nazwa_id_przedm] => j.pol [ocena] => Array ( [0] => Array ( [stopien] => 10/20 [warznosc] => 1 ) [1] => Array ( [stopien] => 3 [warznosc] => 2 ) ) [2] => Array ( [nazwa_id_przedm] => j.ang [ocena] => Array ( [0] => Array ( [stopien] => 5 [warznosc] => 2 ) ) ) ) Ten post edytował zegarek84 18.01.2009, 13:33:41 -------------------- Jeśli twoja ręka rusza do przodu powstrzymaj swój gniew; gdy wyprzedza cię twój gniew - wycofaj rękę.
|
|
|
![]() ![]() |
![]() |
Aktualny czas: 21.08.2025 - 00:06 |