Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.

Da li je moguce elegantnije resenje

[es] :: MySQL :: Da li je moguce elegantnije resenje

[ Pregleda: 2472 | Odgovora: 7 ] > FB > Twit

Postavi temu Odgovori

Autor

Pretraga teme: Traži
Markiranje Štampanje RSS

Psyche
Beograd

Član broj: 43591
Poruke: 112
*.smin.sezampro.yu.



Profil

icon Da li je moguce elegantnije resenje01.08.2006. u 12:43 - pre 215 meseci
Pronasla sam neke smernice kako izracunati medijanu iz niza podataka i ono izgleda ovako:

Code:

$sql0 = mysql_query ("
CREATE TEMPORARY TABLE tmp_table (
id INT UNSIGNED AUTO_INCREMENT NOT NULL PRIMARY KEY,
value VARCHAR( 99 ) NOT NULL );
");

$sql1 = mysql_query ("
CREATE TEMPORARY TABLE tmp_table (
id INT UNSIGNED AUTO_INCREMENT NOT NULL PRIMARY KEY,
value VARCHAR(99) NOT NULL );
");

$sql2 = mysql_query ("
INSERT INTO tmp_table ( value )
SELECT value FROM table ORDER BY 1;
");

$sql3 = mysql_query ("
SELECT @count := COUNT( * ) FROM tmp_table;
");

$mdn = mysql_query ("
SELECT DISTINCT AVG( value ) AS medijana FROM tmp_table
WHERE id IN (FLOOR((@count+1)/2), CEIL((@count+1)/2));
");

$sql4 = mysql_query ("
DROP TEMPORARY TABLE tmp_table;
");


Kod je funkcionalan i dobijam bas ono sto zelim, ali me interesuje da li je moguce isto ovo napisati nekako kompaktnije. Takodje, ovu vrednost cu morati da racunam cak cetiri puta i ispisujem na istoj stranici u okviru cetiri tabelice: za sve grupe, za prvu, drugu i trecu. Trenutno pravim 4 kompletna seta ovih upita s tim sto u poslednja tri dodajem uslov tipa:

SELECT value FROM table WHERE grupa=1 ORDER BY 1;

itd.

Da li mozete da mi predlozite neko bolje resenje od ovog?
Hvala!
 
Odgovor na temu

jablan

Član broj: 8286
Poruke: 4541



+710 Profil

icon Re: Da li je moguce elegantnije resenje01.08.2006. u 13:04 - pre 215 meseci
Imaš ovde odgovor iz prve ruke:

http://mysql-udf.sourceforge.net/
 
Odgovor na temu

Psyche
Beograd

Član broj: 43591
Poruke: 112
*.smin.sezampro.yu.



Profil

icon Re: Da li je moguce elegantnije resenje01.08.2006. u 13:21 - pre 215 meseci
Da, hvala. Znam za taj link, bila sam u prilici da procitam napisano, ali koliko sam uspela da shvatim aggregate funkcije mogu da se koriste samo na starijim bazama, sto meni ne odgovara, a i nisam sigurna da li bih uspela da ih implementiram.
Takodje, nekad instant resenja nisu sasvim idelna - npr. MySQL moze da racuna standardnu devijacu, ali samo populacijsku. Iako se uzoracka razlikuje nekad zanemarljivo malo, potrebni su nam tacne vredosti, te ovako imam bolju kontrolu nad statisticima koje racunam, iako to predstavlja dodatnu komplikaciju.


Ovde, istina postoji deo koda za medijanu:
* count the number of rows in the table with
SELECT COUNT(*) FROM {table name}
* if the retrieved number of rows is odd, get the value directly with
SELECT {column name} FROM {table name} ORDER BY {column name} LIMIT {(total number of rows in table-1)/2},1
* if the number of rows is even, get the two relevant values from the table with
SELECT {column name} FROM {table name} ORDER BY {column name} LIMIT {(total number of rows in table-1)/2},2
add them afterwards and divide the results by 2
ali jednistavno ne znam kako da postavi uslov za parne i neparne brojeve i dobijem sta zelim.
 
Odgovor na temu

jablan

Član broj: 8286
Poruke: 4541



+710 Profil

icon Re: Da li je moguce elegantnije resenje01.08.2006. u 13:48 - pre 215 meseci
Citat:
Psyche: ali jednistavno ne znam kako da postavi uslov za parne i neparne brojeve i dobijem sta zelim.

1) Ako tvoja verzija podržava stored procedure, onda u stored proceduri
2) Ako ne podržava, onda u aplikaciji (pretpostavljam da je PHP u pitanju)

Eh, da, ako često imate potrebe za ovakvim statističkim i ostalim funkcijama koje po defaultu nisu podržane, mislim da bi vrlo dobro bilo da ih instalirate kao UDF-ove. Iz više razloga.
 
Odgovor na temu

Psyche
Beograd

Član broj: 43591
Poruke: 112
*.smin.sezampro.yu.



Profil

icon Re: Da li je moguce elegantnije resenje01.08.2006. u 15:57 - pre 215 meseci
Slazem se da je UDF idealno resenje, ali ja se u tome svemu ne snalazim bas dobro. Sama da napisem korisnicku funkciju ne umem, ali i niko od ljudi koji saradjuju sa mnom na projektu. Btw. nismo nikakvi programeri, nesto smo sasvim deseto.

Gledala sam malo ove sa linka i nemam predstavu sta sav taj kod znaci. Inace, potreban mi je jedan odredjen broj funkcija koji u potpunosti simulira SPSS u MySQL/PHP okruzenju i posle malo muke napravila sam odgovarajuce upite koji su proizveli zeljeni efekat. To donekle jos i mogu da razumem :)

Pokusala sam da napravim ovakav jednostavan upit:
Code:

$sql = mysql_query ("
SELECT num_correct 
AS medijana
FROM nq_Stats 
ORDER BY num_correct 
LIMIT {($cases + 1)/2},1 
");

$mdn = mysql_result($sql, 0, 'medijana');


ali mi uvek vrati 0 uz upozorenje.


Warning: mysql_result(): supplied argument is not a valid MySQL result resource

Trenutno znam da imam neparan broj unosa tj. $cases = 269, pa sam koristila verziju upita za neparan broj.

Btw. u originalu pise LIMIT {(total number of rows in table-1)/2},1
Ne znam zasto -1, kad se mesto na kom se medijana nalazi odredjuje ovako: (n+1)/2

Verzija baze je: 5.0.21
 
Odgovor na temu

Psyche
Beograd

Član broj: 43591
Poruke: 112
*.smin.sezampro.yu.



Profil

icon Re: Da li je moguce elegantnije resenje01.08.2006. u 16:00 - pre 215 meseci
Jos jedno pitanje, da li ja kao obican korisnik baze mogu da istoj dodam svoje korisnicke funkcije i koliko je takva procedura komplikovana?
 
Odgovor na temu

jablan

Član broj: 8286
Poruke: 4541



+710 Profil

icon Re: Da li je moguce elegantnije resenje01.08.2006. u 16:17 - pre 215 meseci
Vitičaste zagrade su oni u primeru koristili da označe mesto gde ide ta neka tvoja vrednost, a ne sintaksu. Dakle, trebalo bi da imaš nešto kao
Code:

$cases = ($cases + 1) / 2;

$sql = mysql_query ("
SELECT num_correct 
AS medijana
FROM nq_Stats 
ORDER BY num_correct 
LIMIT $cases, 1 
");

$mdn = mysql_result($sql, 0, 'medijana');

Naravno, pre ovoga moraš da dodeliš vrednost promenljivoj $cases.
Citat:
Psyche: Jos jedno pitanje, da li ja kao obican korisnik baze mogu da istoj dodam svoje korisnicke funkcije i koliko je takva procedura komplikovana?

S obzirom na nivo znanja koji poseduješ, mislim da nema smisla da se upuštaš u instalaciju UDF-ova (kao što vidiš na onom linku, prvo treba da ih iskompajliraš, zatim iskopiraš među ostale dinamičke biblioteke i tek na kraju obavestiš MySQL o njihovom postojanju komandom CREATE FUNCTION). :(

Još jedno pitanje: jesi li sigurna da je PHP pravi jezik za ono što pišete?

I još jedno pitanje: koju verziju MySQL-a koristite, ako je u pitanju 5, možete iskoristiti kreiranje STORED procedura i funkcija.
 
Odgovor na temu

Psyche
Beograd

Član broj: 43591
Poruke: 112
*.smin.sezampro.yu.



Profil

icon Re: Da li je moguce elegantnije resenje01.08.2006. u 17:03 - pre 215 meseci
Verzija je 5.0.21.

Inace, ne pisem celu aplikaciju, zapravo preradjujem kviz modul u Moodle-u koji ce nam sluziti za testiranje studenata. Pravim novu sekciju u kojoj cu imati iscrpniju statistiku nego sto je ona po default-u. Tako mogu u realnom vremenu da ocitavam sve bitne podatke i cuvam ih. U suprotnom, morala bih stalno da ih izvozim u SPSS i tu dobijam ono sto mi je potrebno.
 
Odgovor na temu

[es] :: MySQL :: Da li je moguce elegantnije resenje

[ Pregleda: 2472 | Odgovora: 7 ] > FB > Twit

Postavi temu Odgovori

Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.