Avatar billede TumseMM Nybegynder
17. oktober 2011 - 22:37 Der er 18 kommentarer og
1 løsning

Brugerens gennemsnitlige rating

Hej Eksperter!

Har denne side hvor man rater hinandens sætninger. Men jeg ville gerne have en overordnet "user_avg_rating" som er den gennemsnitlige rating på alle de sætninger brugeren har skrevet, divideret med hvor mange sætninger den pågældende bruger har skrevet :)

Er det nogenlunde forståeligt? :) Ellers spørg!!

Jeg har denne "avg_rating", men som kun er den gennemsnitlige rating for én af sætningerne brugeren har skrevet.


<?php
$res1 = mysql_query("SELECT * FROM a WHERE username = '$_SESSION[username]'");
$row = mysql_num_rows($res1); //hvor mange gange brugeren har lavet et post.

$res_avg = mysql_query("SELECT AVG(rating) AS avg_rating FROM ratings
                            WHERE a_id = '$id' AND user_id = $_SESSION[user_id]") or die(mysql_error());

    $row_avg = mysql_fetch_array($res_avg);
    $avg_rating = $row_avg['avg_rating'];

       
            echo''.$_SESSION['username'].' du har en gennemsnitlig rating på '.$avg_rating/$row.'';
?>



Hvordan lægger man "avg_rating" sammen med "avg_rating" fra de andre sætninger brugeren har skrevet, og dividerer med hvor mange sætninger han har skrevet??

Tak på forhånd!
Avatar billede DeeDawg Nybegynder
17. oktober 2011 - 23:44 #1
Alt du behøver, er et loop. I dit tilfælde, et while loop. Dette giver dig mulighed for at gøre noget med alle rows i din databaser som matcher dine kriterier, istedet for kun et enkelt.

Her har du et eksempel:

<?php
    $res1 = mysql_query("SELECT * FROM a WHERE username = '".$_SESSION['username']."'");
    $row = mysql_num_rows($res1);
   
    $total_rating = 0;
    $res_avg = mysql_query("SELECT AVG(rating) AS avg_rating FROM ratings WHERE a_id = '$id' AND user_id = '".$_SESSION['user_id']."'") or die(mysql_error());
   
    while($row_avg = mysql_fetch_array($res_avg)){
        $total_rating = $total_rating + $row_avg['avg_rating'];
    }
   
    $average_rating = $total_rating / $row;
    echo $_SESSION['username'].", du har en gennemsnitlig rating på ".$average_rating;
?>

Håber det hjælper. ;)

Mere info?

Du kan læse mere om while loops her:
http://php.net/manual/en/control-structures.while.php
http://w3schools.com/php/php_looping.asp
Avatar billede TumseMM Nybegynder
18. oktober 2011 - 11:00 #2
Hej tak for inputtet :)

Det virker desværre ikke, da den laver alle mulige underlige tal som jeg ikke ved hvor kommer fra.

Jeg har fjernet  WHERE user_id != '".$_SESSION['user_id']."'"), da det lige er gået op for mig at 'user_id'et er for fra folk som rater sætningen, og ikke personen der har lavet sætningen..

Skal man lave et 'username' som er for folk der har lavet sætningen inde i 'ratings'?
Avatar billede majbom Novice
18. oktober 2011 - 11:40 #3
kan du ikke bare lave en AVG på alle ratings?
Avatar billede TumseMM Nybegynder
18. oktober 2011 - 12:13 #4
Hvad mener du splazz? :) hvordan ville du gøre det?
Avatar billede majbom Novice
18. oktober 2011 - 12:40 #5
fjerne a.id i din WHERE-clause:

$res_avg = mysql_query("SELECT AVG(rating) AS avg_rating FROM ratings WHERE user_id = $_SESSION[user_id]") or die(mysql_error());
Avatar billede TumseMM Nybegynder
18. oktober 2011 - 14:43 #6
ah på den måde :)

Den ser sådan her ud nu, men den lader stadig ikke til at fungere :(

<?php
    $res1 = mysql_query("SELECT * FROM a WHERE username = '".$_SESSION['username']."'");
    $row = mysql_num_rows($res1);
   
    $total_rating = 0;
    $res_avg = mysql_query("SELECT AVG(rating) AS avg_rating FROM ratings WHERE user_id != '".$_SESSION['user_id']."'") or die(mysql_error());
   
    while($row_avg = mysql_fetch_array($res_avg)){
        $total_rating = $total_rating + $row_avg['avg_rating'];
    }
   
    $average_rating = $total_rating / $row;
    echo $_SESSION['username'].", du har en gennemsnitlig rating på ".$average_rating;
?>

What's wrong?
Avatar billede majbom Novice
18. oktober 2011 - 16:51 #7
i din anden query henter du avg-rating på alt andet end den aktuelle bruger. hvis det er det du vil, vil du nok gerne have det PER bruger og ikke ALLE brugere som et samlet gennemsnit - prøv med:

"SELECT AVG(rating) AS avg_rating FROM ratings WHERE user_id != ".$_SESSION['user_id']." GROUP BY user_id"


så skulle du gerne få én række pr. bruger (undtaget den aktuelle bruger)
Avatar billede TumseMM Nybegynder
19. oktober 2011 - 18:20 #8
Jeg vil gerne hente avg_rating på hver enkelt bruger, så hver bruger har en personlig gennemsnitlig rating.

Alle deres sætningers gennemsnitlige rating / hvor mange sætninger de har skrevet.

Så brugerne får en personlig gennemsnitlig rating.
Ved bare ikke hvordan man laver det.


OBS. user_id i 'ratings' er user_id'et for brugeren der har rated sætningen, og IKKE brugeren der har skrevet den.

Hvad gør jeg? :)
Avatar billede majbom Novice
19. oktober 2011 - 18:32 #9
har du læst #7? der står opskriften
Avatar billede TumseMM Nybegynder
19. oktober 2011 - 19:42 #10
Hej splazz :)

Det er underligt, fordi det lader til, at den regner det fuldstændig forkert ud?

Jeg har skrevet fire sætninger på min bruger, TumseMM, og rated dem alle på mine andre brugere.
Gennemsnitsratingen var på sætningerne:

1
2
5
3

det giver altså (1+2+5+3)/4 = 2,75 gennemsnitsrating

Men scriptet regner det ud til: 0,6875

?????
Avatar billede majbom Novice
19. oktober 2011 - 20:34 #11
hmm, kan du ikke smide et tabledump på pastebin.com?
Avatar billede TumseMM Nybegynder
19. oktober 2011 - 21:14 #12
Tror det er rigtigt nok det jeg har gjort :)

http://pastebin.com/aGGANi40

Har trykket eksport inde i phpmyadmin, for tabel 'a' som er den tabel der opbevarer sætningerne, og 'ratings' som er den der holder ratings :)
Avatar billede majbom Novice
19. oktober 2011 - 21:23 #13
hvis du kun har de 4 linjer i din tabel og du logger ind med et andet user_id end 3, burde det  altså virke med koden i #7...
Avatar billede TumseMM Nybegynder
19. oktober 2011 - 22:03 #14
Nå :( men giv et svar splazz og DeeDawg, tak for hjælpen ellers!
Avatar billede majbom Novice
19. oktober 2011 - 22:12 #15
Avatar billede TumseMM Nybegynder
19. oktober 2011 - 22:28 #16
er du sikker på, at det ikke er fordi du tror user_id'et er for den der har skrevet sætningen?

Det er altså for den der har <u>rated</u> sætningen? tror du ikke det er det?

Skal jeg så bare lave en kolonne i tabel ratings, der hedder f.eks. 'forfatter' hvor jeg får brugeren, der har skrevet sætningen ind?
Avatar billede majbom Novice
20. oktober 2011 - 08:03 #17
ahh okay, så giver det mere mening :)

ja enten skal du have brugerens id med, eller skal du joine din sætningstabel på og gruppere på user_id i dén...
Avatar billede TumseMM Nybegynder
20. oktober 2011 - 11:57 #18
hvis du ville indsætte forfatterens username ind i tabel: ratings.

Skal man så ikke bare gøre noget i denne stil:

mysql_query("INSERT INTO a (text,username,time,q_id,user_id) VALUES ('$_POST[tekst]','$_SESSION[username]',NOW(),'$_POST[q_id]','$_SESSION[user_id]')");

mysql_query("INSERT INTO ratings (username) VALUES ('$_SESSION[username]')");

Den øverste er den der indsætter data i a, som er den tabel der holder folks sætninger.

Men den indsætter ikke ind i ratings. forfatterens username kommer ikke ind i ratings?
Avatar billede majbom Novice
20. oktober 2011 - 12:19 #19
jeg ville altså bruge user_id i stedet for, det er noget hurtigere når du skal søge i dine tabeller at gøre det på tal (husk at indexere dem)
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Vi tilbyder markedets bedste kurser inden for webudvikling

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester