Co zrobic, gdy strona laduje sie ponad minute z MYSQL a?

pyt Q


a jak to jest z tym grupowaniem po srednich? skad je bierzesz?
Z pytania 17 - odpowiedz 12,13 lub 14..
jak na razie pisane na oko: SELECT pr.*, p.przedmiotid, p.nazwa, p.rodzaj, SUM(odp.waga)/COUNT(odp.waga) as srednia FROM prowadzacy pr LEFt JOIN przedmioty pr ON pr.prowadzacyid = pp.prowadzacyid LEFT JOIN prowadzadzy_przedmioty pp ON pp.przedmiotid = p.przedmiotid LEFT JOIN wynik_odpowiedzi wodp ON (wodp.prowadzacyid = pr.prowadzacyid AND wodp.przedmiotid = p.przedmiotid) LEFT JOIN odpowiedzi odp ON odp.odpowiedzid = wodp.odpowiedzid GROUP BY p.prowadzacyid, pr.przedmiotid
sprawdz co to wypluwa(jak syntaxError to sporoboj poprawic).
Chyba powinno byc tak:
SELECT pr.* p.przedmiotid, p.nazwa, p.rodzaj, SUM(odp.waga)/COUNT(odp.waga) as srednia FROM prowadzacy pr LEFT JOIN przedmioty p ON pr.prowadzacyid = pp.prowadzacyid LEFT JOIN prowadzacy_przedmioty pp ON pp.przedmiotid = p.przedmiotid LEFT JOIN wyniki wodp ON (wodp.prowadzacyid = pr.prowadzacyid AND wodp.przedmiotid = p.przedmiotid) LEFT JOIN odpowiedzi odp ON odp.odpowiedzid = wodp.odpowiedzid GROUP BY pr.prowadzacyid, p.przedmiotid;
wyniki=wynik_odpowiedzi - tzn w bazie mam wyniki, ale to zmienilem, jak wyzej.
Tylko cos nie tak z parametrem ON. Jeszcze nie doszedlem, gdzie blad.
ERROR (0): Cross dependency found in OUTER JOIN; examine your ON conditions
Czyli: Bierzemy tabele prowadzacy i do niej dlaczamy nazwa, rodzaj, srednia pobierajac wartosci z kolejnych tabel. Tylko, ze prowadzacy_przedmioty jest "polaczona" z tabela prowadzacy i przedmioty. Nie wiem, jak dziala LEFT JOIN z tabelami polaczonymi. Moze w tym jakis problem? Jedynie tabela Wyniki jest "luzna", nie dolaczona do zadnej z tabel.

Pozdrawiam orcus
.: IE służy do przeglądania internetu z twojego komputera i na odwrót :.
LEFT JOIN wyniki wodp ON (wodp.prowadzacyid = pr.prowadzacyid AND wodp.przedmiotid = p.przedmiotid) LEFT JOIN odpowiedzi odp ON odp.odpowiedzid = wodp.odpowiedzid GROUP BY pr.prowadzacyid, p.przedmiotid;

Troche sie pobawilem i doszedlem do:
select pr.*, p.przedmiotid, p.nazwa, p.rodzaj from przedmioty p, prowadzacy pr, prowadzacy_przedmioty pp where p.przedmiotid=pp.przedmiotid and pr.prowadzacyid=pp.prowadzacyid;
Zwraca mi wszystkich prowadzacych (imiona, nazwiska) oraz wszystkie przedmioty(nazwa, rodzaj), ktore prowadza, czyli to co chce miec na stonce.
Tylko, do tego chcialbym dodac jeszcze ten fragment:
Ale, nie wiem jak to zrobic, cos mi nie wychodzi. Mozesz mine naprowadzic?


odp A

Na MyISAM tez moza to robic? Czy ma cala baze konwertowac do InnoDB? Mówisz o indeksach?? o ile mi wiadomo do każdy format bazy MUSI to obsługiwać.
Jeśli o cache to robi się to na poziomie phpa a nie bazy. Poszukaj sobie informacji np. o adodb tam jest cache zaimplementowane. W każdym razie oznacza to z twojej strony zmianę metody dostępu do bazy czyli przepisanie sporej części kodu - wiem boli ale daje wyniki.

odp A

Ale, nie wiem jak to zrobic, cos mi nie wychodzi. Mozesz mine naprowadzic? ja strasznie nie lubie selectow z roznych tabel starej daty jestem i dla mnie JOIN sa czytelne a ten wynalazek zupelnie nie.
natomiast w zaptaniu ktore Ci podalem byly male bledy:
SELECT pr.*, p.przedmiotid, p.nazwa, p.rodzaj, SUM(odp.waga)/COUNT(odp.waga) as srednia FROM prowadzacy pr LEFT JOIN prowadzadzy_przedmioty pp ON pr.prowadzacyid = pp.prowadzacyid LEFT JOIN przedmioty p ON pp.przedmiotid = p.przedmiotid LEFT JOIN wynik_odpowiedzi wodp ON (wodp.prowadzacyid = pr.prowadzacyidAND wodp.przedmiotid = p.przedmiotid) LEFT JOIN odpowiedzi odp ON odp.odpowiedzid = wodp.odpowiedzid GROUP BY pp.prowadzacyid, pp.przedmiotid
jak bede mial dluzsza chwile to zerkne na dalssze warunki.

odp A

On Mon, 07 May +, Przemek
Ale, nie wiem jak to zrobic, cos mi nie wychodzi. Mozesz mine naprowadzic?
ja strasznie nie lubie selectow z roznych tabel starej daty jestem i dla mnie JOIN sa czytelne a ten wynalazek zupelnie nie.
natomiast w zaptaniu ktore Ci podalem byly male bledy:
SELECT pr.*, p.przedmiotid, p.nazwa, p.rodzaj, SUM(odp.waga)/COUNT(odp.waga) as srednia FROM prowadzacy pr LEFT JOIN prowadzadzy_przedmioty pp ON pr.prowadzacyid = pp.prowadzacyid LEFT JOIN przedmioty p ON pp.przedmiotid = p.przedmiotid LEFT JOIN wynik_odpowiedzi wodp ON (wodp.prowadzacyid = pr.prowadzacyid AND wodp.przedmiotid = p.przedmiotid) LEFT JOIN odpowiedzi odp ON odp.odpowiedzid = wodp.odpowiedzid GROUP BY pp.prowadzacyid, pp.przedmiotid
jak bede mial dluzsza chwile to zerkne na dalssze warunki.
.: IE służy do przeglądania internetu z twojego komputera i na odwrót :.


Zmodyfikowalem dla oceny sredniej z pytania 8 (w "odpowiedz" na to pytanie jest juz liczba i nie trzeba pobierac wagi).
SELECT pr.prowadzacyid, p.przedmiotid, p.nazwa, p.rodzaj, SUM(odp.odpowiedz)/COUNT(odp.odpowiedz) as srednia FROM prowadzacy pr LEFT JOIN prowadzacy_przedmioty pp ON pr.prowadzacyid = pp.prowadzacyid LEFT JOIN przedmioty p ON pp.przedmiotid = p.przedmiotid LEFT JOIN wyniki wodp ON (wodp.prowadzacyid = pr.prowadzacyid AND wodp.przedmiotid = p.przedmiotid and wodp.pytanieid=8) LEFT JOIN odpowiedzi odp ON odp.odpowiedzid = wodp.odpowiedzid GROUP BY pp.prowadzacyid, pp.przedmiotid;
Ocena ogolna: pytania za wyjatkiem 8, 10, 11, 17.
SELECT pr.prowadzacyid, p.przedmiotid, p.nazwa, p.rodzaj, SUM(odp.waga)/COUNT(odp.waga) as srednia FROM prowadzacy pr LEFT JOIN prowadzacy_przedmioty pp ON pr.prowadzacyid = pp.prowadzacyid LEFT JOIN przedmioty p ON pp.przedmiotid = p.przedmiotid LEFT JOIN wyniki wodp ON (wodp.prowadzacyid = pr.prowadzacyid AND wodp.przedmiotid = p.przedmiotid and wodp.pytanieid8 and wodp.pytanieid10 and wodp.pytanieid11 and wodp.pytanieid17) LEFT JOIN odpowiedzi odp ON odp.odpowiedzid wodp.odpowiedzid GROUP BY pp.prowadzacyid, pp.przedmiotid;
Caly proces trwa jakies 2.5s na kazde z zapytan. Troche szybciej niż moj skrypt. Tylko, ze moj skrypt w Drugiej Tabeli, gdzie sa warunki w zaleznosci od sredniej liczy to juz z 3min:)
Jak po dodaniu warunkow dla SQL'a zajmie to 5s, to bede zadowolony.
Pozniej bede musial dodac jeszcze 2 filtry. Jezeli w pytaniach oprocz 8,10,11,17 wystapily 4 razy odpowiedz "nie mam zdania", to tej ankiety nie bierzemy pod uwage. Jezeli w pytaniu 10 udzual w zajeciach < 30% to tez nie bierzemy pod uwage. Zatem pewnie bede musial zapytanie wzbohacic nastepujaco: LEFT JOIN wyniki wodp ON (wodp.wynik_numer=(select XXX) and wodp.prowadzacyid = pr.prowadzacyid AND wodp.przedmiotid = p.przedmiotid and wodp.pytanieid=8) w (select XXX) wyszukac numery ankiet (wynik_numer), ktore spelniaja warunek)
Moze, jak zobacze ten podzial w zaleznosci od sredniej, to latwiej mi bedzie to napisac. Jutro jeszcze potrenuje.
Pozdrawiam


Dodaj odpowiedź

Tytuł:

Mail: (w celu weryfikacji posta)