[php/mysql] Selectie van hoogste gem. rating *

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Ik heb een prima werkend ratingsysteem, de tabel ziet er als volgt uit:
PHP:
1
2
3
4
5
artID    rating  IPadres          datum
1        4       xxx.xxx.xxx.xxx  ddmmyyyy
1        3       xxx.xxx.xxx.xxx  ddmmyyyy
3        5       xxx.xxx.xxx.xxx  ddmmyyyy
4        2       xxx.xxx.xxx.xxx  ddmmyyyy

In de database wordt dus per artikelID iedere rating per user opgeslagen. Ik kan dan voor bijvoorbeeld artikelID 1 vrij eenvoudig de gemiddelde rating bepalen. Eerst totaal aantal stemmen per artikelID tellen en daarna de totale ratingscore delen door het aantal. Zo ver kom ik dus.

Nu het probleem. Ik zou graag een top 10 willen maken van de artikelen met de hoogste gemiddelde rating. Ik weet niet hoe ik dat moet uitvoeren. Is het mogelijk om eerst per artikel een gemiddelde uit te rekenen en vervolgens de hoogste 10 eruit te pikken?

Acties:
  • 0 Henk 'm!

  • D2k
  • Registratie: Januari 2001
  • Laatst online: 02-09 11:02

D2k

de functie AVG() wel eens gezien?

Doet iets met Cloud (MS/IBM)


Acties:
  • 0 Henk 'm!

  • justmental
  • Registratie: April 2000
  • Niet online

justmental

my heart, the beat

code:
1
2
3
4
5
select artid, avg(rating)
from    tabel
group by artid
order by avg(rating) desc
limit xxx

zoiets?

Who is John Galt?


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Ja die heb ik zelfs gebruikt bij de beschreven queries. Probleem is dat ik het niet voor elkaar krijg om de beschreven factoren bij elkaar te brengen.

Berekenen van het aantal stemmen op een specifiek ID:
SELECT count(*) AS num FROM ratings WHERE artikel_ID=1

Berekenen van de gemiddelde rating:
SELECT COUNT(*) as num, AVG(rating) AS rating FROM ratings WHERE artikelID=1

en dan omrekenen naar een percentage of whatever.

[ Voor 49% gewijzigd door Verwijderd op 01-10-2003 13:58 ]


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
justmental schreef op 01 October 2003 @ 13:54:
code:
1
2
3
4
5
select artid, avg(rating)
from    tabel
group by artid
order by avg(rating) desc
limit xxx

zoiets?
Als ik het zo uitvoer, krijg ik de error invalid use op group function.
Maar rekent ie met "SELECT artid, avg(rating)" het gemiddelde uit per artid?

Acties:
  • 0 Henk 'm!

  • whoami
  • Registratie: December 2000
  • Laatst online: 12:52
code:
1
select avg(blaat) / sum(blaat) * 100

https://fgheysels.github.io/


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Ik ben eruit, thanx allemaal. Wist niet dat avg zo te gebruiken was, weer wat geleerd. Dit is em geworden (for the record):

SELECT artid, avg(rating)
FROM ratings
GROUP BY artid DESC
LIMIT 10

Acties:
  • 0 Henk 'm!

  • justmental
  • Registratie: April 2000
  • Niet online

justmental

my heart, the beat

Toch bijzonder dat MySQL, een DESC bij een GROUP BY. :o

Who is John Galt?


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
justmental schreef op 01 October 2003 @ 14:11:
Toch bijzonder dat MySQL, een DESC bij een GROUP BY. :o
Goed punt :) Copypaste foutje
Het werkt bij nader inzien ook nog niet helemaal! Dit is de situatie:

SELECT artid, avg(rating)
FROM ratings
GROUP BY artid
LIMIT 10

Ik krijg nu inderdaad netjes de 10 artid's met de hoogste gemiddelde ratings. Krijg het alleen niet voor elkaar om ze te sorteren! Wat ik ook probeer met ORDER BY, ik krijg aldoor errors..... Weet iemand hoe ik de query zo krijg dat ze netjes op volgorde komen??

[ Voor 4% gewijzigd door Verwijderd op 01-10-2003 14:44 ]


Acties:
  • 0 Henk 'm!

  • curry684
  • Registratie: Juni 2000
  • Laatst online: 06-09 00:37

curry684

left part of the evil twins

ORDER BY gebruiken ipv SORT BY?

Professionele website nodig?


Acties:
  • 0 Henk 'm!

  • curry684
  • Registratie: Juni 2000
  • Laatst online: 06-09 00:37

curry684

left part of the evil twins

Volgens mij zoek je:
SQL:
1
2
3
4
5
SELECT artid AS Naam, count(rating) AS Stemmen, avg(rating) AS Gemiddelde
FROM ratings
GROUP BY Naam
ORDER BY Gemiddelde, Stemmen DESC
LIMIT 10

Al eens een goeie tutorial gevolgd? :P

Professionele website nodig?


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
curry684 schreef op 01 October 2003 @ 14:42:
ORDER BY gebruiken ipv SORT BY?
Sorry, tikfoutje. Met ORDER BY werkt het ook niet :) Als ik ORDER BY rating doe, krijg ik geen sortering van het gemiddelde maar van de eerste score. Als ik ORDER BY avg(rating) of ORDER BY artid, avg(rating) doe krijg ik errors.

Acties:
  • 0 Henk 'm!

  • curry684
  • Registratie: Juni 2000
  • Laatst online: 06-09 00:37

curry684

left part of the evil twins

Verwijderd schreef op 01 October 2003 @ 14:46:
[...]
Sorry, tikfoutje. Met ORDER BY werkt het ook niet :) Als ik ORDER BY rating doe, krijg ik geen sortering van het gemiddelde maar van de eerste score.
Dat is toch nogal logisch, als je sorteert op die score :P
Als ik ORDER BY avg(rating) of ORDER BY artid, avg(rating) doe krijg ik errors.
Daarom kun je dus met 'AS' aliassen aanmaken voor een kolom. Je kunt niet sorteren op een functieresultaat, alleen op een kolom. Vandaar dat je dus AS nodig hebt. Ziet er meteen mooier uit in je resultaat :)

Professionele website nodig?


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Ik ben geen ster in het formuleren van queries dus ik ben erg blij met je suggestie, die overigens ook werkt. Krijg nu een prima top 10, alleen of ik nu ASC of DESC in de query gebruik, de uiteindelijke lijst blijft altijd oplopend.... Beetje vaag. Ga dus nog even doorknutselen maar in ieder geval bedankt!!

Acties:
  • 0 Henk 'm!

  • curry684
  • Registratie: Juni 2000
  • Laatst online: 06-09 00:37

curry684

left part of the evil twins

Pardon dat is mijn fout. In een ORDER BY kun je voor iedere kolom apart de richting opgeven, oftewel:
SQL:
1
2
3
4
5
SELECT artid AS Naam, count(rating) AS Stemmen, avg(rating) AS Gemiddelde
FROM ratings
GROUP BY Naam
ORDER BY Gemiddelde DESC, Stemmen DESC
LIMIT 10

Professionele website nodig?


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Ik had 'em net ontdekt, inderdaad gesorteerd op gemiddelde ipv stemmen. Werkt top nu.
Pagina: 1