ďťż
Przejrzyj wiadomości
aaaaCo zrobic, gdy strona laduje sie ponad minute z MYSQL'a?aaaa



Przemek - 11-05-2007 12:30
Co zrobic, gdy strona laduje sie ponad minute z MYSQL'a?
  Witam

Mam PIII 500MHz 256Mb, sporo procesow i do tego MYSQL.
Jest okolo 8 tabel + tabela z wynikami, a w niej klucze podstawowe z tych 8.
Rekordow jest 15.000 (bedzie okolo 30.000), wiec pewnie stronka bedzie sie
ladowac 5 min.
Wrzucenie calych wartosci z tych 8 tabel do wynikowej (zeby tamte mozna bylo
pominac w zapytaniach) nic nie da.
Na stronie generuje tabele z wynikami, a w skrypcie jest duzo warunkow,
jakies sumy, srednie, zliczanie itp.

Jedynym pomyslem, na jaki wpadlem jest generowanie drugiej strony (html lub
php).
Tylko jak to zrobic? Nie che mi sie bawic w tworzenie i zapisywanie do
pliku, moze da sie jakos szybciej, jakas gotowa funkcja?

Jak, chce pobrac swieze dane, to wlaczam generuj.php, ktore tworzy mi
prezentuj.php.
Jak nie ma zadnych zmian w bazie, to klikam tylko prezentuj.php.

Pozdrawiam




Kserkses - 11-05-2007 12:30

  Zoptymalizowac zapytanie?

--
Kserkses
Do krwi ostatniej kropli z żył, bronić będziemy ducha,
aż się rozpadnie w proch i w pył, pisowska zawierucha.
Twierdzą nam będzie każdy próg. Tak nam dopomóż Bóg! ...




adasiek - 11-05-2007 12:30

  "Przemek" <mystre[bez_tego]@wp.pl> wrote in
news:f1ljgs$m6i$1@inews.gazeta.pl:

> Mam PIII 500MHz 256Mb, sporo procesow i do tego MYSQL.
> Jest okolo 8 tabel + tabela z wynikami, a w niej klucze podstawowe z
> tych 8. Rekordow jest 15.000 (bedzie okolo 30.000), wiec pewnie
> stronka bedzie sie ladowac 5 min.
> Wrzucenie calych wartosci z tych 8 tabel do wynikowej (zeby tamte
> mozna bylo pominac w zapytaniach) nic nie da.
> Na stronie generuje tabele z wynikami, a w skrypcie jest duzo
> warunkow, jakies sumy, srednie, zliczanie itp.

czy bylbys sklonny pokazac nam kod PHP? caly kod;

PS: jezeli myslisz, ze dla silnika bazy danych problemem jest
LICZBA tabel wystepujaca w zapytaniu, to sie mylisz; problemem
moze byc brak indeksow na tabelach, lub - co jest tutaj bardziej
prawdopodobnie - bardzo nieumiejetne laczenie tych tabel po
kluczach obcych;

adas;




Przemek - 11-05-2007 12:30

  Jak mozna zopytmalizowac cos takiego (Ankieta):

1. Z tabeli 1 pobieram prowadzacych.
2. Sprawdzam jakie przedmioty prowadzi tabela2.
3. W wynikach wyszukuje rekorow z danym przedmiotem i prowadzacym.
4. Segreguje dodatkowo wzgledem sredniej studenta, czyli sprawdzam jego
srednia w kolejnej tabeli.
5. Po drodze pobieram z innej tabeli Wagi przypisane do odpowiedzi oraz
obliczam punkty, srednie, ktore pozniej wyswietlam.

Zapytania sa typu:
1. select count(odpowiedz), avg(odpowiedz) from (select odpowiedzid from
wyniki where wyniki.pytanieid=8 and wyniki.prowadzacyid='$prowadzacyid' and
wyniki.przedmiotid='$przedmiotid') as srednia";
2.select odpowiedzi.odpowiedz from odpowiedzi, wyniki where
odpowiedzi.odpowiedzid=wyniki.odpowiedzid and wyniki.pytanieid=8 and
wyniki.prowadzacyid='$prowadzacyid' and wyniki.przedmiotid='$przedmiotid'
and wyniki.wynik_numer='$wynik_numer'";
3.select waga from odpowiedzi where odpowiedzid='".$odpowiedzid."'";
4. select odpowiedzid from wyniki where wyniki.pytanieid=17 and
wyniki.wynik_numer='$wynik_numer'";

Nie wiem, jak moglbym to zoptymalizowac.
Na kazdym kroku musze cos pobrac, aby uzyc w kolejnym kroku.
Moge prosic o jakas podpowiedz?

Użytkownik "Kserkses" <kserkses@amorki.pl> napisał w wiadomości
news:f1lk11$r52$3@news.onet.pl...
> Zoptymalizowac zapytanie?
>
>
> --
> Kserkses
> Do krwi ostatniej kropli z żył, bronić będziemy ducha,
> aż się rozpadnie w proch i w pył, pisowska zawierucha.
> Twierdzą nam będzie każdy próg. Tak nam dopomóż Bóg! ...
>




Borys =?iso-8859-2?Q?Pogore=B3o?= - 11-05-2007 12:30

  Dnia Mon, 7 May 2007 00:34:02 +0200, Przemek napisał(a):

> Nie wiem, jak moglbym to zoptymalizowac.

Sprawdziłeś który etap jest najbardziej czasochłonny?

Odpisuj pod postem.

--
Borys Pogoreło
borys(#)leszno,edu,pl




Przemek - 11-05-2007 12:30

 
Użytkownik "Borys Pogoreło" <borys@pl.edu.leszno> napisał w wiadomości
news:69lpg1xx663c.147zecwshsfo5$.dlg@40tude.net...
> Dnia Mon, 7 May 2007 00:34:02 +0200, Przemek napisał(a):
>
>> Nie wiem, jak moglbym to zoptymalizowac.
>
> Sprawdziłeś który etap jest najbardziej czasochłonny?
>
> Odpisuj pod postem.
>
> --
> Borys Pogoreło
> borys(#)leszno,edu,pl

Tu jest metoda, ktora wykonuje sie najdluzej.
Sa tam petle w petlach. Jest to pierwszy projekt jaki robie i pewnie da sie
to jakos "ulepszyc".

http://www.przemus.one.pl/file.txt

Sporo tego, wiec daje link.
W tabeli z wynikami jest tak:

indeks autoinkrementowany | wynik_numer (numer zlozonej ankiety - jest
anonimowa) | prowadzacyid | przedmiotid | pytanieid | odpowiedzid
W wierszach sa liczby.
okolo 30 prowadzacych
okolo 15 pytan na przedmiot
okolo 30 przedmiotow
W zaleznosci od specjalnosci na 1 studenta przypada kolo 12
przedmiotow*okolo 15 pytan na przedmiot, co daje okolo 200 wpisow.




orcus - 11-05-2007 12:30

  On Mon, 07 May 2007 09:34:42 +0200, Przemek wrote:

> Tu jest metoda, ktora wykonuje sie najdluzej.
> Sa tam petle w petlach. Jest to pierwszy projekt jaki robie i pewnie da sie
> to jakos "ulepszyc".

> indeks autoinkrementowany | wynik_numer (numer zlozonej ankiety - jest
> anonimowa) | prowadzacyid | przedmiotid | pytanieid | odpowiedzid
> W wierszach sa liczby.
> okolo 30 prowadzacych
> okolo 15 pytan na przedmiot
> okolo 30 przedmiotow

jesli mozesz to wystaw zrzut BD(moze byc z losowymi, ale snsownymi danymi)
i wynik jaki chcesz uzyskac w jakiejs przystepnej formie, bo dojscie z
tego co pokazales do struktury BD i wyniku bedzie chyba zbyt meczace.

--
Pozdrawiam
orcus

..: IE służy do przeglądania internetu z twojego komputera i na odwrót :.




JerzyM - 11-05-2007 12:30

  Dnia 7-5-07 00:06, Przemek napisał(a):

> Na stronie generuje tabele z wynikami, a w skrypcie jest duzo warunkow,
> jakies sumy, srednie, zliczanie itp.

skoro dane są wrzucane okresowo i właściwie nie modyfikowane to:
a) stwórz indeksy na wszystkich polach które występują w klauzulach where
b) zastanów się nad użyciem jakiegoś cache bazy bo po co za każdym razem
pobierać dokładnie to samo z bazy skoro sama zawartość zmienia się rzadko

--
--------------------------------
Opinie wygłaszane na newsach są moim prywatnym
zdaniem nie mającym nic wspólnego z jakimkolwiek
byłym, obecnym lub przyszłym moim pracodawcą.




Przemek - 11-05-2007 12:30

 
Użytkownik "orcus" <orcus@ekoterm.N05P4M.net> napisał w wiadomości
news:pan.2007.05.07.08.13.45.128817@ekoterm.N05P4M .net...
> On Mon, 07 May 2007 09:34:42 +0200, Przemek wrote:
>
>> Tu jest metoda, ktora wykonuje sie najdluzej.
>> Sa tam petle w petlach. Jest to pierwszy projekt jaki robie i pewnie da
>> sie
>> to jakos "ulepszyc".
>
>> indeks autoinkrementowany | wynik_numer (numer zlozonej ankiety - jest
>> anonimowa) | prowadzacyid | przedmiotid | pytanieid | odpowiedzid
>> W wierszach sa liczby.
>> okolo 30 prowadzacych
>> okolo 15 pytan na przedmiot
>> okolo 30 przedmiotow
>
> jesli mozesz to wystaw zrzut BD(moze byc z losowymi, ale snsownymi danymi)
> i wynik jaki chcesz uzyskac w jakiejs przystepnej formie, bo dojscie z
> tego co pokazales do struktury BD i wyniku bedzie chyba zbyt meczace.
>
> --
> Pozdrawiam
> orcus
>
> .: IE służy do przeglądania internetu z twojego komputera i na odwrót :.
>

Jest to ocena, kazdego prowadzacego, ze wszystkich przedmiotow ktore
prowadzi.
Jene prowadzacy moze prowadzic dajny na to 2 przedmioty, lub 1 przedmiot 2
prowadzacych.
Ocena ta opiera sie na pytaniu 8, gdzie wybiera sie 1 z 3 odpowiedzi. Te
odpowiedzi maja swoja wage, ktora tez pobieram z bazy.
Z tego wszystkiego licze srednia dla kazdego ocenionego prowadzacego.
To dodatkowo, dziele w zaleznosci od sredniej studenta i wyswietlam.

Druga czesc pliku, ktora wykonuje sie wolniej, bierze pod uwage wicej niz 1
pytania, np 10.
Odpowiedzi tez maja okreslona wage. Tylko liczy sie ja wtedy dodatkowo za
odpowiedz (bo raze bedzie ich wiecen niz 1, bo 10 pytan).
Reszta tak jak wyzej.

Moze pobrac wszystkie tabele do tabeli asocjacyjnej i tam na nich operowac?
Wtedy bedzie mniej polaczen do bazy. Tylko, czy ramu wystarczy?;)

Mam jeszcze jeden problem. Pierwsze pole w tabeli wyniki jest
autoinkrementowane.
Zaczynalo sie od 1....., ale testujac skrypty usuwalem cala zawartosc
tabeli.
Po po ponownym skladaniu ankiety, wartosc ta nie zaczyna sie od 1, tylko od
tej ktora byla przed usunieciem.
Jak, to "wyzerowac" ?




orcus - 11-05-2007 12:30

  On Mon, 07 May 2007 13:12:15 +0200, Przemek wrote:

> Druga czesc pliku, ktora wykonuje sie wolniej, bierze pod uwage wicej niz 1
> pytania, np 10.
> Odpowiedzi tez maja okreslona wage. Tylko liczy sie ja wtedy dodatkowo za
> odpowiedz (bo raze bedzie ich wiecen niz 1, bo 10 pytan).
> Reszta tak jak wyzej.

tak na oko nie da sie tego ocenic(czytaj nie chce mi sie i watpie zeby
komus sie chcialo). Daj dane(zrzut BD latwo wykonac).

> Moze pobrac wszystkie tabele do tabeli asocjacyjnej i tam na nich operowac?
> Wtedy bedzie mniej polaczen do bazy. Tylko, czy ramu wystarczy?;)

Nie, nie i jeszcze raz nie. Od teog sa wlasnie BD.

> Po po ponownym skladaniu ankiety, wartosc ta nie zaczyna sie od 1, tylko od
> tej ktora byla przed usunieciem.
> Jak, to "wyzerowac" ?

http://dev.mysql.com/doc/refman/5.0/en/truncate.html

--
Pozdrawiam
orcus

..: IE służy do przeglądania internetu z twojego komputera i na odwrót :.




Przemek - 11-05-2007 12:30

 
Użytkownik "orcus" <orcus@ekoterm.N05P4M.net> napisał w wiadomości
news:pan.2007.05.07.08.13.45.128817@ekoterm.N05P4M .net...
> On Mon, 07 May 2007 09:34:42 +0200, Przemek wrote:
>
>> Tu jest metoda, ktora wykonuje sie najdluzej.
>> Sa tam petle w petlach. Jest to pierwszy projekt jaki robie i pewnie da
>> sie
>> to jakos "ulepszyc".
>
>> indeks autoinkrementowany | wynik_numer (numer zlozonej ankiety - jest
>> anonimowa) | prowadzacyid | przedmiotid | pytanieid | odpowiedzid
>> W wierszach sa liczby.
>> okolo 30 prowadzacych
>> okolo 15 pytan na przedmiot
>> okolo 30 przedmiotow
>
> jesli mozesz to wystaw zrzut BD(moze byc z losowymi, ale snsownymi danymi)
> i wynik jaki chcesz uzyskac w jakiejs przystepnej formie, bo dojscie z
> tego co pokazales do struktury BD i wyniku bedzie chyba zbyt meczace.
>
> --
> Pozdrawiam
> orcus
>
> .: IE służy do przeglądania internetu z twojego komputera i na odwrót :.
>

Przykladowo jest tak:

$wynik - tu mam liste wszystkich prowadzacych

for($i=0; $i < $ilu_prowadzacych; $i++)
{
//sprawdzamy, jakie przedmioty prowadzi dany prowadzacy
$wiersz = mysql_fetch_assoc($wynik);//Prowadzacy
$prowadzacyid = stripslashes($wiersz['prowadzacyid']);

$przedmioty = "select przedmioty.przedmiotid,
przedmioty.nazwa, przedmioty.rodzaj from przedmioty, prowadzacy,
prowadzacy_przedmioty where
przedmioty.przedmiotid=prowadzacy_przedmioty.przed miotid and
prowadzacy.prowadzacyid=prowadzacy_przedmioty.prow adzacyid and
prowadzacy.prowadzacyid='$prowadzacyid'";
$wynik_przedmioty = mysql_query($przedmioty);
....
// a tu kolejna petla for, it petla w petli.

Jak widac, petla przyjdzie tyle razy ilu jest prowadzacych, kolejna tyle ile
jest przedmiotow...itd

A gdyby zrocic cos takiego:

$wynik - tu mam liste wszystkich prowadzacych
$przedmioty - tu pobrac liste wszystkich przedmiotow, ale nie dla
pojedynczego prowadzacego, ale od razu dla wszystkich prowadzacych
$wynik_przedmioty = mysql_query($przedmioty);

$przedmioty_prowadzacego - tu beda przedmioty 1 prowadzacego

for($i=0; $i < $ilu_prowadzacych; $i++)
{
//sprawdzamy, jakie przedmioty prowadzi dany prowadzacy
$wiersz = mysql_fetch_assoc($wynik);//Prowadzacy
$prowadzacyid = stripslashes($wiersz['prowadzacyid']);

//tu zamiast w petli i kolejnych petlach laczyc sie z baza, to juz mam
tablice $wynik_przedmioty pobrana raz.
//teraz z tej tablicy wydobyc dane dla poszczegolnych prowadzacych za pomoca
'$prowadzacyid'";
//Tylko, jak przeszukac taka tablice, albo wydobyc z niej te informacje?

for ($a=0; $a < count($wynik_przedmioty); $a++)
{
$wiersz_1 = mysql_fetch_assoc($wynik_przedmioty);
$prowadzacyid_1 =
stripslashes($wiersz_1['prowadzacyid']);
if($prowadzacyid == $prowadzacyid_1)
{

//Jak tu skopiowac caly wiersz z "wiersz_1" do wiersza 1-go
$przedmioty_prowadzacego???
//Tablica $przedmioty zawiera kolumny: przedmiotid, nazwa, rodzaj.

$przedmioty_prowadzacego =
}
}
....
W rozwiazaniu drugim skrypt laduje tabele do pamieci i tam sobie obrabia.
Czy takie rozwiazanie bedzie szybsze?
Tylko, co bedzie jak zaladuje 30.000 wierszy, a z tabeli utworze kolejne mi
potrzbne? Moze sie okazac, ze za malo ramu.




Przemek - 11-05-2007 12:30

 
Użytkownik "JerzyM" <jerzy.mackiewicz_nospam@gmail.com> napisał w wiadomości
news:id767jxs68d$.e03u4aathbfh$.dlg@40tude.net...
> Dnia 7-5-07 00:06, Przemek napisał(a):
>
>> Na stronie generuje tabele z wynikami, a w skrypcie jest duzo warunkow,
>> jakies sumy, srednie, zliczanie itp.
>
> skoro dane są wrzucane okresowo i właściwie nie modyfikowane to:
> a) stwórz indeksy na wszystkich polach które występują w klauzulach where
> b) zastanów się nad użyciem jakiegoś cache bazy bo po co za każdym razem
> pobierać dokładnie to samo z bazy skoro sama zawartość zmienia się rzadko
>
> --
> --------------------------------
> Opinie wygłaszane na newsach są moim prywatnym
> zdaniem nie mającym nic wspólnego z jakimkolwiek
> byłym, obecnym lub przyszłym moim pracodawcą.

Na MyISAM tez moza to robic? Czy ma cala baze konwertowac do InnoDB?

A moze jest jakas instukcja, ktora mi utowrzy plik z zawartoscia strony?
Klikam na generuj.php -> wyswietla mi sie stronka i to co jest w "zrodlach
strony" leci mi do file.txt ?




orcus - 11-05-2007 12:30

  On Mon, 07 May 2007 13:12:15 +0200, Przemek wrote:

> Jest to ocena, kazdego prowadzacego, ze wszystkich przedmiotow ktore
> prowadzi.
> Jene prowadzacy moze prowadzic dajny na to 2 przedmioty, lub 1 przedmiot 2
> prowadzacych.
> Ocena ta opiera sie na pytaniu 8, gdzie wybiera sie 1 z 3 odpowiedzi. Te
> odpowiedzi maja swoja wage, ktora tez pobieram z bazy.
> Z tego wszystkiego licze srednia dla kazdego ocenionego prowadzacego.
> To dodatkowo, dziele w zaleznosci od sredniej studenta i wyswietlam.
>
> Druga czesc pliku, ktora wykonuje sie wolniej, bierze pod uwage wicej niz 1
> pytania, np 10.
> Odpowiedzi tez maja okreslona wage. Tylko liczy sie ja wtedy dodatkowo za
> odpowiedz (bo raze bedzie ich wiecen niz 1, bo 10 pytan).
> Reszta tak jak wyzej.

chcesz zeby Ci pomoc? To podaj dokladny algorytm, bo to powyzej to metny
zarys. Jak Ci sie nie chce to mecz sie sam - ile mozna prosic, tyle ze
to co chcesz zrobic pewnie da sie w jednym zapytaniu uzyskac. Jak na razie
zobacz co Ci zwroci:

SELECT pr.*, p.przedmiotid, p.nazwa, p.rodzaj
FROM prowadzacy pr
LEFt JOIN przedmioty pr ON pr.prowadzacyid = pp.prowadzacyid
LEFT JOIN prowadzadzy_przedmioty pp ON pp.przedmiotid = p.przedmiotid
LEFT JOIN wyniki w ON w.prowadzacyid = p.prowadzacyid
WHERE w.pytanieid = 8
GROUP BY p.prowadzacyid, pr.przedmiotid

poza tym przeczytaj:
http://pl.php.net/mysql_fetch_assoc
http://dev.mysql.com/doc/refman/5.0/...functions.html

--
Pozdrawiam
orcus

..: IE służy do przeglądania internetu z twojego komputera i na odwrót :.




Przemek - 11-05-2007 12:30

 
Użytkownik "orcus" <orcus@ekoterm.N05P4M.net> napisał w wiadomości
news:pan.2007.05.07.11.39.14.433023@ekoterm.N05P4M .net...
> On Mon, 07 May 2007 13:12:15 +0200, Przemek wrote:
>
>> Druga czesc pliku, ktora wykonuje sie wolniej, bierze pod uwage wicej niz
>> 1
>> pytania, np 10.
>> Odpowiedzi tez maja okreslona wage. Tylko liczy sie ja wtedy dodatkowo za
>> odpowiedz (bo raze bedzie ich wiecen niz 1, bo 10 pytan).
>> Reszta tak jak wyzej.
>
> tak na oko nie da sie tego ocenic(czytaj nie chce mi sie i watpie zeby
> komus sie chcialo). Daj dane(zrzut BD latwo wykonac).

Nie dziwie sie.

>
>> Moze pobrac wszystkie tabele do tabeli asocjacyjnej i tam na nich
>> operowac?
>> Wtedy bedzie mniej polaczen do bazy. Tylko, czy ramu wystarczy?;)
>
> Nie, nie i jeszcze raz nie. Od teog sa wlasnie BD.

Czyli rozwiazanie, ktore przedstawilem w poprzednim poscie sie nie nadaje...

>
>> Po po ponownym skladaniu ankiety, wartosc ta nie zaczyna sie od 1, tylko
>> od
>> tej ktora byla przed usunieciem.
>> Jak, to "wyzerowac" ?
>
> http://dev.mysql.com/doc/refman/5.0/en/truncate.html

Moja wersja MySQL to 4.1.21, ale rozwiazanie bylo podane na tej stronie.
http://www.przemus.one.pl/ankieta.xls - tu sa wszystkie dane, ktore
wrzucilem do tabel.

Zalozenia:
Prowadzacy, moze prowadzic wiecej niz 1 przedmiot.
1 przedmiot moze byc prowadzony przez wiecej niz 1 prowadzacego.
Pytania do przedmiotow moga sie powtarzac, ale nie musza (moga to byc
wybrane pytania, niekooniecznie w kolejnosci).
Odpowiedzi do pytan, tez moga byc takie same do kazdego, badz rozne.
Dlatego uzylem tabel laczacych.
Tabela z wynikami nie jest polaczona.
Dane z formularza sa tam wrzucane.
wynik_numer - pokazuje numer osoby, ktora wypelnila ankiete.
Jakby cos nie bylo jasne, to moge bardziej sie rozpisac.

Przykladowo *.sql

DROP TABLE IF EXISTS `odpowiedzi`;
CREATE TABLE `odpowiedzi` (
`odpowiedzid` int(10) unsigned NOT NULL auto_increment,
`odpowiedz` char(50) collate latin2_bin NOT NULL default '',
PRIMARY KEY (`odpowiedzid`)
) ENGINE=MyISAM AUTO_INCREMENT=33 DEFAULT CHARSET=latin2 COLLATE=latin2_bin;

DROP TABLE IF EXISTS `prowadzacy_przedmioty`;
CREATE TABLE `prowadzacy_przedmioty` (
`prowadzacyid` int(10) unsigned NOT NULL default '0',
`przedmiotid` int(10) unsigned NOT NULL default '0',
PRIMARY KEY (`prowadzacyid`,`przedmiotid`)
) ENGINE=MyISAM DEFAULT CHARSET=latin2 COLLATE=latin2_bin;

Wyswietlam formularz, wprowadzam dane do tabeli wyniki.
Formularz okolo 250 pytam w zaleznosci od specjalnosci, laduje sie capliem
szybko...2 sekundy.

> --
> Pozdrawiam
> orcus
>
> .: IE służy do przeglądania internetu z twojego komputera i na odwrót :.
>




orcus - 11-05-2007 12:30

  On Mon, 07 May 2007 15:54:06 +0200, Przemek wrote:

a jak to jest z tym grupowaniem po srednich? skad je bierzesz?

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).

--
Pozdrawiam
orcus

..: IE służy do przeglądania internetu z twojego komputera i na odwrót :.




Przemek - 11-05-2007 12:30

 
Użytkownik "Przemek" <mystre[bez_tego]@wp.pl> napisał w wiadomości
news:f1nb28$rqd$1@inews.gazeta.pl...
>
> Użytkownik "orcus" <orcus@ekoterm.N05P4M.net> napisał w wiadomości
> news:pan.2007.05.07.11.39.14.433023@ekoterm.N05P4M .net...
>> On Mon, 07 May 2007 13:12:15 +0200, Przemek wrote:
>>
>>> Druga czesc pliku, ktora wykonuje sie wolniej, bierze pod uwage wicej
>>> niz 1
>>> pytania, np 10.
>>> Odpowiedzi tez maja okreslona wage. Tylko liczy sie ja wtedy dodatkowo
>>> za
>>> odpowiedz (bo raze bedzie ich wiecen niz 1, bo 10 pytan).
>>> Reszta tak jak wyzej.
>>
>> tak na oko nie da sie tego ocenic(czytaj nie chce mi sie i watpie zeby
>> komus sie chcialo). Daj dane(zrzut BD latwo wykonac).
>
>
> Nie dziwie sie.
>
>
>>
>>> Moze pobrac wszystkie tabele do tabeli asocjacyjnej i tam na nich
>>> operowac?
>>> Wtedy bedzie mniej polaczen do bazy. Tylko, czy ramu wystarczy?;)
>>
>> Nie, nie i jeszcze raz nie. Od teog sa wlasnie BD.
>
>
> Czyli rozwiazanie, ktore przedstawilem w poprzednim poscie sie nie
> nadaje...
>
>
>>
>>> Po po ponownym skladaniu ankiety, wartosc ta nie zaczyna sie od 1, tylko
>>> od
>>> tej ktora byla przed usunieciem.
>>> Jak, to "wyzerowac" ?
>>
>> http://dev.mysql.com/doc/refman/5.0/en/truncate.html
>
>
> Moja wersja MySQL to 4.1.21, ale rozwiazanie bylo podane na tej stronie.
> http://www.przemus.one.pl/ankieta.xls - tu sa wszystkie dane, ktore
> wrzucilem do tabel.
>
> Zalozenia:
> Prowadzacy, moze prowadzic wiecej niz 1 przedmiot.
> 1 przedmiot moze byc prowadzony przez wiecej niz 1 prowadzacego.
> Pytania do przedmiotow moga sie powtarzac, ale nie musza (moga to byc
> wybrane pytania, niekooniecznie w kolejnosci).
> Odpowiedzi do pytan, tez moga byc takie same do kazdego, badz rozne.
> Dlatego uzylem tabel laczacych.
> Tabela z wynikami nie jest polaczona.
> Dane z formularza sa tam wrzucane.
> wynik_numer - pokazuje numer osoby, ktora wypelnila ankiete.
> Jakby cos nie bylo jasne, to moge bardziej sie rozpisac.
>
>
> Przykladowo *.sql
>
> DROP TABLE IF EXISTS `odpowiedzi`;
> CREATE TABLE `odpowiedzi` (
> `odpowiedzid` int(10) unsigned NOT NULL auto_increment,
> `odpowiedz` char(50) collate latin2_bin NOT NULL default '',
> PRIMARY KEY (`odpowiedzid`)
> ) ENGINE=MyISAM AUTO_INCREMENT=33 DEFAULT CHARSET=latin2
> COLLATE=latin2_bin;
>
>
> DROP TABLE IF EXISTS `prowadzacy_przedmioty`;
> CREATE TABLE `prowadzacy_przedmioty` (
> `prowadzacyid` int(10) unsigned NOT NULL default '0',
> `przedmiotid` int(10) unsigned NOT NULL default '0',
> PRIMARY KEY (`prowadzacyid`,`przedmiotid`)
> ) ENGINE=MyISAM DEFAULT CHARSET=latin2 COLLATE=latin2_bin;
>
>
> Wyswietlam formularz, wprowadzam dane do tabeli wyniki.
> Formularz okolo 250 pytam w zaleznosci od specjalnosci, laduje sie capliem
> szybko...2 sekundy.
>
>
>
>> --
>> Pozdrawiam
>> orcus
>>
>> .: IE służy do przeglądania internetu z twojego komputera i na odwrót :.
>>
>

To chce uzyskac:

1. Dla danego przedmiotu podać średnią ocenę z pytania nr8 wraz z ilością
uwzględnionych ankiet.

2.Dla danego przedmiotu obliczyć i podać ogólną średnią ze wszystkich pytań
oprócz 8,10,11,17 (w formie: średnia ogólna - liczba).
Należy więc zsumować wagi z pytań 1-7, 9, 12-14(15),16 i podzielić je przez
ilość pytań oraz przez ilość uwzględnionych ankiet.

Dodatkowo te 2 pytania uzaleznic od sredniej studenta, ktroa podaje sie w
pytaniu 17.

Algorytm:

1. Pobieram liste prowadzacych: select * from prowadzacy.

Petla1

2. Pobieram liste przedmiotow, ktore prowadzi dany prowadzacy.

select przedmioty.przedmiotid, przedmioty.nazwa, przedmioty.rodzaj from
przedmioty, prowadzacy, prowadzacy_przedmioty where
przedmioty.przedmiotid=prowadzacy_przedmioty.przed miotid and
prowadzacy.prowadzacyid=prowadzacy_przedmioty.prow adzacyid and
prowadzacy.prowadzacyid='$prowadzacyid'";

Petla 2

Nazwa i rodzaj -> wyswietlane sa w tabeli z wynikami.

3. Sprawdzam ilu bylo ankietujacych.

"select wyniki.wynik_numer from wyniki where wyniki.pytanieid=8 and
wyniki.prowadzacyid='$prowadzacyid' and wyniki.przedmiotid='$przedmiotid'";

Petla 3 - hmm, tu pewnie moglbym wykonac to tylko 1 raz. Pozniej to
sprawdze.

4. Sprawdzam srednia osoby ktora wypelnila ankiete (numery mam z pkt 3)

select odpowiedzid from wyniki where wyniki.pytanieid=17 and
wyniki.wynik_numer='$wynik_numer'";

5. Pobieram udzolene odpowiedz przez ankietujacego dla danego przedmiotu i
prowadzacego.

"select odpowiedzi.odpowiedz from odpowiedzi, wyniki where
odpowiedzi.odpowiedzid=wyniki.odpowiedzid and wyniki.pytanieid=8 and
wyniki.prowadzacyid='$prowadzacyid' and wyniki.przedmiotid='$przedmiotid'
and wyniki.wynik_numer='$wynik_numer'";
Z tego licze srednia:
W $odpowiedz jest liczba, wiec wagi nie musze sprawdzac.

if($student_srednia_oc == 12)
{
$suma_1=$suma_1+$srednia_oc;
$srednia_ocena_1=$suma_1/$ilosc_ankiet;
}
elseif($student_srednia_oc == 13)
{
$suma_2=$suma_2+$srednia_oc;
$srednia_ocena_2=$suma_2/$ilosc_ankiet;
....
//Do tego momentu idzie szybko.

6.Sprawdzam ile udzielono odpowiedzi za Pytania (ponizej sa wyjatki)

select count(*) from (select odpowiedzid from wyniki where
wyniki.pytanieid!=8 and wyniki.pytanieid!=10 and wyniki.pytanieid!=11 and
wyniki.pytanieid!=17 and wyniki.prowadzacyid='$prowadzacyid' and
wyniki.przedmiotid='$przedmiotid') as ocena";

Petla 4 - tu pewnie tez mogl, to tylko raz wykonac.

7. Pobieram odpowiedzi jakie udzielono na te pytania.

select odpowiedzid from wyniki where wyniki.pytanieid!=8 and
wyniki.pytanieid!=10 and wyniki.pytanieid!=11 and wyniki.pytanieid!=17 and
wyniki.prowadzacyid='$prowadzacyid' and wyniki.przedmiotid='$przedmiotid'
and wyniki.wynik_numer='$wynik_numer'";

8. Znow pobieram srednia studenta, ale tym razem juz sie nie lacze z baza -
uzywam juz pobranej tabeli.

Petla 5

9.Odczytuje wage za odpowiedz.

select waga from odpowiedzi where odpowiedzid='".$odpowiedzid."'";

W zaleznosci od sredniej licze ocene ogolna podobnie, jak ocene srednia.

KONIEC




Przemek - 11-05-2007 12:30

 
Użytkownik "orcus" <orcus@ekoterm.N05P4M.net> napisał w wiadomości
news:pan.2007.05.07.14.32.35.448164@ekoterm.N05P4M .net...
> On Mon, 07 May 2007 15:54:06 +0200, Przemek wrote:
>
> 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 1120 (42000): 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 :.
>




Przemek - 11-05-2007 12:30

 
Użytkownik "Przemek" <mystre[bez_tego]@wp.pl> napisał w wiadomości
news:f1nm5f$e9l$1@inews.gazeta.pl...
>
> Użytkownik "orcus" <orcus@ekoterm.N05P4M.net> napisał w wiadomości
> news:pan.2007.05.07.14.32.35.448164@ekoterm.N05P4M .net...
>> On Mon, 07 May 2007 15:54:06 +0200, Przemek wrote:
>>
>> 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 1120 (42000): 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 :.
>>
>

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:

> 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;

Ale, nie wiem jak to zrobic, cos mi nie wychodzi.
Mozesz mine naprowadzic?




JerzyM - 11-05-2007 12:30

  Dnia 7-5-07 14:28, Przemek napisał(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.

--
--------------------------------
Opinie wygłaszane na newsach są moim prywatnym
zdaniem nie mającym nic wspólnego z jakimkolwiek
byłym, obecnym lub przyszłym moim pracodawcą.




orcus - 11-05-2007 12:30

  On Mon, 07 May 2007 20:40:44 +0200, Przemek wrote:

> 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.

--
Pozdrawiam
orcus

..: IE służy do przeglądania internetu z twojego komputera i na odwrót :.




Przemek - 11-05-2007 12:30

 
Użytkownik "orcus" <orcus@ekoterm.N05P4M.net> napisał w wiadomości
news:pan.2007.05.07.20.37.35.882200@ekoterm.N05P4M .net...
> On Mon, 07 May 2007 20:40:44 +0200, Przemek wrote:
>
>> 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.
>
> --
> Pozdrawiam
> orcus
>
> .: 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.pytanieid<>8 and wodp.pytanieid<>10 and wodp.pytanieid<>11 and
wodp.pytanieid<>17) 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




orcus - 11-05-2007 12:30

  On Mon, 07 May 2007 23:54:34 +0200, Przemek wrote:

> 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.

w SQL jest tez cos takiego jak IF a nawet CASE. Polecam manual do MySQLa
do którego linka już dostałeś.

--
Pozdrawiam
orcus

..: IE służy do przeglądania internetu z twojego komputera i na odwrót :.




top_ch - 11-05-2007 12:30

 
Użytkownik "Przemek" <mystre[bez_tego]@wp.pl> napisał w wiadomości
news:f1ljgs$m6i$1@inews.gazeta.pl...
> Witam
>
> Mam PIII 500MHz 256Mb, sporo procesow i do tego MYSQL.
> Jest okolo 8 tabel + tabela z wynikami, a w niej klucze podstawowe z tych
> 8.
> Rekordow jest 15.000 (bedzie okolo 30.000), wiec pewnie stronka bedzie sie
> ladowac 5 min.
> Wrzucenie calych wartosci z tych 8 tabel do wynikowej (zeby tamte mozna
> bylo pominac w zapytaniach) nic nie da.
> Na stronie generuje tabele z wynikami, a w skrypcie jest duzo warunkow,
> jakies sumy, srednie, zliczanie itp.
>
> Jedynym pomyslem, na jaki wpadlem jest generowanie drugiej strony (html
> lub php).
> Tylko jak to zrobic? Nie che mi sie bawic w tworzenie i zapisywanie do
> pliku, moze da sie jakos szybciej, jakas gotowa funkcja?
>
> Jak, chce pobrac swieze dane, to wlaczam generuj.php, ktore tworzy mi
> prezentuj.php.
> Jak nie ma zadnych zmian w bazie, to klikam tylko prezentuj.php.
>
>
> Pozdrawiam
>
Kup sobie nowego kompa np: PIV 1GB Ramu ;)




Przemek - 11-05-2007 12:31

 
Użytkownik "orcus" <orcus@ekoterm.N05P4M.net> napisał w wiadomości
news:pan.2007.05.07.22.23.02.599273@ekoterm.N05P4M .net...
> On Mon, 07 May 2007 23:54:34 +0200, Przemek wrote:
>
>> 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.
>
> w SQL jest tez cos takiego jak IF a nawet CASE. Polecam manual do MySQLa
> do którego linka już dostałeś.
>
> --
> Pozdrawiam
> orcus
>
> .: IE służy do przeglądania internetu z twojego komputera i na odwrót :.
>

Ok, pozniej doczytam, bo nie wiedzialem.
A, co myslisz o stworzeniu tabeli tymczasowych?

Wziasc tabele Wyniki i z niej wydobyc:
1. Ankiety, w ktorych udzial jest wiekszy 30% (pyt 10)
2. Z tego co otrzymam usunac przedmioty, w ktorych wybrano 4 razy odm "nie
mam zdania"
3. To co otrzymam podzielic w zaleznosci od sredniej(beda 3 tabele) i
przepuscic przez zapytania w poprzednim poscie. (pyt 17)

Pewnie da sie to w 1 zapytaniu, no ale chodzi mi o wykorzystaine tabel
tymczasowych.




Jacek Czerwinski - 11-05-2007 12:31

  Dnia Mon, 7 May 2007 23:54:34 +0200, Przemek napisał(a):

> Użytkownik "orcus" <orcus@ekoterm.N05P4M.net> napisał w wiadomości
> news:pan.2007.05.07.20.37.35.882200@ekoterm.N05P4M .net...
>> On Mon, 07 May 2007 20:40:44 +0200, Przemek wrote:
>>
>>> 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,

> ...
>
> w (select XXX) wyszukac numery ankiet (wynik_numer), ktore spelniaja
> warunek)

można sobie radzić ze "złożonością programową" przez dzielenie na mniejsze
części. Dla mnie mniejsze częsci w SQL to przede wszystkim View
(przynajmniej w normalnych bazach danych), są procedury itd.

Po drugie jeśli merytorycznie trzyma się kupy (a trzyma się?), tylko
problem z wydajnością, są środki by to przeanalizować. Np w Postgresie sie
to nazywa explain. Ślicznie podaje która część query bierze milisekundy.

Kto jest tym szczęśliwcem, który wybrał MySQL do "korporacyjnych" spraw?




Przemek - 11-05-2007 12:31

 
Użytkownik "Jacek Czerwinski" <x@y.z.pl> napisał w wiadomości
news:14bq1b9e5y1tq$.tflbbuui3qes$.dlg@40tude.net.. .
> Dnia Mon, 7 May 2007 23:54:34 +0200, Przemek napisał(a):
>
>> Użytkownik "orcus" <orcus@ekoterm.N05P4M.net> napisał w wiadomości
>> news:pan.2007.05.07.20.37.35.882200@ekoterm.N05P4M .net...
>>> On Mon, 07 May 2007 20:40:44 +0200, Przemek wrote:
>>>
>>>> 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,
>
>> ...
>>
>> w (select XXX) wyszukac numery ankiet (wynik_numer), ktore spelniaja
>> warunek)
>
> można sobie radzić ze "złożonością programową" przez dzielenie na mniejsze
> części. Dla mnie mniejsze częsci w SQL to przede wszystkim View
> (przynajmniej w normalnych bazach danych), są procedury itd.

Zapytania dzielic? Pisz jasniej;)

> Po drugie jeśli merytorycznie trzyma się kupy (a trzyma się?), tylko
> problem z wydajnością, są środki by to przeanalizować. Np w Postgresie sie
> to nazywa explain. Ślicznie podaje która część query bierze milisekundy.
>

W MySQL tez jest explain. Jak napisze cale zapytanie, to wtedy zobacze.
Moj, problem polegal na tym, ze uzylem w skrypcie duza ilosc zapytan do bazy
w petlach for.
Powinienem zbudowac zapytanie, ktore mi od razu wyswietli to co chce - tak
jak mi to napisal Orcus.

> Kto jest tym szczęśliwcem, który wybrał MySQL do "korporacyjnych" spraw?

Sam sie zglosilem, zeby to wykonac. Aby sie czegos nauczyc, to trzeba cos
zrobic.
Dlaczego MySQL? Bo kiedys cos czytalem o "bazach dla ksiegarni
internetowych" ;)
Od czegos trzeba zaczac...
Baza jest OK, tylko teraz juz wiem, ze zapytan nie nalezy wykonywac w
petlach;)

Pozdrawiam




Jacek Czerwinski - 11-05-2007 12:31

  Dnia Tue, 8 May 2007 17:41:53 +0200, Przemek napisał(a):

> Użytkownik "Jacek Czerwinski" <x@y.z.pl> napisał w wiadomości
> news:14bq1b9e5y1tq$.tflbbuui3qes$.dlg@40tude.net.. .
>> Dnia Mon, 7 May 2007 23:54:34 +0200, Przemek napisał(a):
>>
>>> Użytkownik "orcus" <orcus@ekoterm.N05P4M.net> napisał w wiadomości
>>> news:pan.2007.05.07.20.37.35.882200@ekoterm.N05P4M .net...
>>>> On Mon, 07 May 2007 20:40:44 +0200, Przemek wrote:
>>>>
>>
>> można sobie radzić ze "złożonością programową" przez dzielenie na mniejsze
>> części. Dla mnie mniejsze częsci w SQL to przede wszystkim View
>> (przynajmniej w normalnych bazach danych), są procedury itd.
>
> Zapytania dzielic? Pisz jasniej;)

Ale nie dzielić "linijką" tylko w sensie zawierania się (dawniej mówiło się
podprogramów) najczęscie wydzielam jakby 'subselect', wydzielony,
wytestowany, obejrzany. Powstaje ci "wirtualna tabela" i z niej znów
selektujesz... np. pierwszy view wybiera z 2-3 tabel i jakoś filtruje,
drugi view czyta już z niego, itd.
(w PG nie było minusów wydajnościowych z tego powodu.)
Jak miałem query na połtora ekranu zgłupiał bym bez tego. A potem się
okazywało, że view przydał się 2, 3-raz

>> Po drugie jeśli merytorycznie trzyma się kupy (a trzyma się?), tylko
>> problem z wydajnością, są środki by to przeanalizować. Np w Postgresie sie
>> to nazywa explain. Ślicznie podaje która część query bierze milisekundy.
>>
>
> W MySQL tez jest explain. Jak napisze cale zapytanie, to wtedy zobacze.
> Moj, problem polegal na tym, ze uzylem w skrypcie duza ilosc zapytan do bazy
> w petlach for.
Można kilka, ale nie 'dużo'.

> Powinienem zbudowac zapytanie, ktore mi od razu wyswietli to co chce - tak
> jak mi to napisal Orcus.
>
>> Kto jest tym szczęśliwcem, który wybrał MySQL do "korporacyjnych" spraw?
>
> Sam sie zglosilem, zeby to wykonac. Aby sie czegos nauczyc, to trzeba cos
> zrobic.
> Dlaczego MySQL? Bo kiedys cos czytalem o "bazach dla ksiegarni
> internetowych" ;)
Baza historycznie o rodowodzie "do skryptów internetowych" (szybka i
uproszczona, choć z niestandardowymi trickami).
Z latami oba słowa się rozmyły szybkośc stosunkowo w dół, "zdolności" w
górę ... ale osobiście wole bazy z inną starszą "szkołą" bo to czuć.

> Baza jest OK, tylko teraz juz wiem, ze zapytan nie nalezy wykonywac w
> petlach;)
Na 5-tej wersji?




Przemek - 11-05-2007 12:31

 
Użytkownik "Przemek" <mystre[bez_tego]@wp.pl> napisał w wiadomości
news:f1o76s$boc$1@inews.gazeta.pl...
>
> Użytkownik "orcus" <orcus@ekoterm.N05P4M.net> napisał w wiadomości
> news:pan.2007.05.07.20.37.35.882200@ekoterm.N05P4M .net...
>> On Mon, 07 May 2007 20:40:44 +0200, Przemek wrote:
>>
>>> 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.
>>
>> --
>> Pozdrawiam
>> orcus
>>
>> .: 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.pytanieid<>8 and wodp.pytanieid<>10 and wodp.pytanieid<>11 and
> wodp.pytanieid<>17) 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
>

Przepisalem powyzsze zapytania na swoj sposob.

SELECT pr.nazwisko, p.przedmiotid, p.nazwa, p.rodzaj,
SUM(odp.odpowiedz)/COUNT(odp.odpowiedz) as srednia
FROM wyniki w, prowadzacy pr, przedmioty p, odpowiedzi odp
WHERE w.pytanieid=8
AND w.prowadzacyid=pr.prowadzacyid
AND w.przedmiotid=p.przedmiotid
AND w.odpowiedzid=odp.odpowiedzid
GROUP BY w.przedmiotid, w.prowadzacyid
ORDER BY pr.nazwisko;

Teraz czas reakcji wynosi 0,07s ;)
Przy tamtych z LEFT JOIN 2,17s.

Hmm, nie wiem dlaczego tak jest, ale wydaje mi sie, ze przy tych LEFT JOIN
jest zle dobrana kolejnosc dolaczania tabel
i pewnie dlatego zajmuje to wiecej czasu.

No, ale nauczylem sie uzywac GROUP BY...ze tez tak latwo dalo sie to
wydobyc.
Jeszcze bede musial dorobic te warunki...




Strona 1 z 2 • Zostało znalezionych 66 rezultatów • 1, 2

infinity69 Tylko ja i moja przestrzeń.