Avatar billede Slettet bruger
27. oktober 2007 - 12:15 Der er 19 kommentarer og
1 løsning

Gennemsnit (sql)

Hej - jeg har en række poster (indlæg) i min database, som andre brugere kan "rate" (altså bedømme) fra 1-5. Ved hver post gemmer jeg flg.:

rating_total = antal af samlede ratings
rating_count = antal gange den pågældende post er blevet ratet

Ved hver på siden der viser indlæggene vises postens gennemsnitlige rating: rating = (rating_total/rating_count)

Mit spørgsmål går på: Kan man indskrive ovenstående i en sql-streng så man kan sortere efter gennemsnit?
Avatar billede sherlock Nybegynder
27. oktober 2007 - 12:39 #1
Select avg(rating) as rating, posting from entries
group by posting
order by rating desc;
Avatar billede Slettet bruger
27. oktober 2007 - 13:30 #2
Hej sherlock,

Jeg forstår ikke helt - hvad er "posting" i dit eksempel?

Har du mod på at tydeliggøre det lidt for mig?

Mit tabel hedder "poster" (den indeholder alle indlæggene) og felterne "rating_total" (samlede rating) og "rating_count" (antal ratings)

Håber du kan hjælpe :-)
Avatar billede Slettet bruger
27. oktober 2007 - 13:53 #3
altså - min db ligner noget i stil med:

-----------------------------------------
indlæg | rating_total | rating_count
-----------------------------------------
txt1  |      12      |        1
-----------------------------------------
txt2  |      149    |        15
-----------------------------------------
txt3  |      60      |        23
-----------------------------------------
txt4  |      4      |        1
-----------------------------------------
Avatar billede nielle Nybegynder
27. oktober 2007 - 14:15 #4
sherlock's forslag basere sig på den gængse måde at lave rankings ... nemlig ved at have en enkelt række for hver eneste ranking en eller anden laver. Det er så ikke den måde du har valgt at gøre det på.

Prøv med:

SELECT *, rating_total/rating_count AS rating_avg
FROM dinTabel
WHERE rating_count>0
ORDER BY rating_avg DESC
Avatar billede Slettet bruger
27. oktober 2007 - 14:39 #5
Hej nielle, ja - det er noget i den stil, jeg er ude efter...

Jeg får desværre flg. retur:

Too few parameters. Expected 1.
Avatar billede Slettet bruger
27. oktober 2007 - 14:41 #6
der mangler ikke noget "format" i den sql-streng?
Avatar billede nielle Nybegynder
27. oktober 2007 - 15:24 #7
Hmm, prøv med dette så:

SELECT * FROM
(
SELECT *, rating_total/rating_count AS rating_avg
FROM dinTabel
WHERE rating_count>0
)
ORDER BY rating_avg DESC

Hvad er det for en format du mangler?
Avatar billede Slettet bruger
27. oktober 2007 - 15:37 #8
Jeg tænkte på noget i stil med:

SQL = "SELECT *, format(rating_total/rating_count) AS rating_avg FROM poster WHERE rating_count > 0 ORDER BY rating_avg DESC;"

Men hvad ved jeg... jeg prøver dit nye bud...
Avatar billede Slettet bruger
27. oktober 2007 - 15:48 #9
Sweet - ser ud til at virke perfekt!

Kan du lige klare en sidste også:

rating = (rating_total/rating_count)

her kan rating eks. blive: "4,1379310344827629" - altså med mange decimaler - findes der ikke en nem løsning til at sige max 1 decimal; altså "4,1"?

(husk at svare for at få pointene)

Mange tak for hjælpen!
Avatar billede Slettet bruger
27. oktober 2007 - 15:50 #10
Nå, den klarede jeg selv:

response.write Round(rating, 2)

2 = antal decimaler man ønsker

Husk at svare! :-)
Avatar billede Slettet bruger
27. oktober 2007 - 16:01 #11
Hmm ja - der var så alligevel lige en ting: jeg ønsker stadig at indlæg der IKKE er blevet ratet (altså rating = 0) bliver vist.

Det sker selvf. ikke med ovenstående sql - problemet er at hvis jeg fjerner "WHERE rating_count>0" fra sql'en kommer flg. fejl:

[Microsoft][ODBC Microsoft Access Driver]Numeric value out of range (null)
Avatar billede Slettet bruger
27. oktober 2007 - 16:03 #12
Jeg forstår godt at man ikke kan dividere med "0" - men kan man ikke komme omkring det så indlæg der ikke er ratet alligevel kommer med ud i sql-trækningen?
Avatar billede nielle Nybegynder
27. oktober 2007 - 16:34 #13
Hvad med denn her?

SELECT * FROM
(
SELECT *, iff(rating_count<>0;rating_total/rating_count;0) AS rating_avg
FROM dinTabel
)
ORDER BY rating_avg DESC
Avatar billede Slettet bruger
27. oktober 2007 - 16:42 #14
Hmm, desværre - den siger:

[Microsoft][ODBC Microsoft Access Driver] Syntax error in FROM clause.


(SQL: SQL = "SELECT * FROM (SELECT *, if(rating_count<>0;rating_total/rating_count;0) AS rating_avg FROM poster WHERE frasideid = '" & id & "') ORDER BY rating_avg DESC;")
Avatar billede nielle Nybegynder
27. oktober 2007 - 16:48 #15
, i stedet for ;

SQL = "SELECT * FROM (SELECT *, if(rating_count<>0,rating_total/rating_count,0) AS rating_avg FROM poster WHERE frasideid = '" & id & "') ORDER BY rating_avg DESC")
Avatar billede Slettet bruger
27. oktober 2007 - 16:57 #16
hmm, næh... med:

SQL = "SELECT * FROM (SELECT *, if(rating_count<>0,rating_total/rating_count,0) AS rating_avg FROM poster WHERE frasideid = '" & id & "') ORDER BY rating_avg DESC"

får jeg:

[Microsoft][ODBC Microsoft Access Driver] Undefined function 'if' in expression.
Avatar billede nielle Nybegynder
27. oktober 2007 - 17:33 #17
Den skal hedde iff
Avatar billede nielle Nybegynder
27. oktober 2007 - 17:33 #18
Dvs: iif
Avatar billede Slettet bruger
27. oktober 2007 - 17:39 #19
Great - der var den sgu. Tusind tak!
Avatar billede nielle Nybegynder
27. oktober 2007 - 17:40 #20
Svar :^)
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
Kurser inden for grundlæggende programmering

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