database indeling rating script
Tabel producten
id - naam - beschrijving - ratingid
Tabel rating
id - ratingid - cijfer - uitleg
Nu heb ik het script zo laten werken dat hij alle cijfers in de rating tabel optelt voor het product met ratingid en deze dan deelt door het aantal ratings. Hier komt dan een gemiddeld cijfer uit.
Dit werkt allemaal prima. Maar nu wil ik een top 5 van producten met de hoogste beoordeling maken. De bedoeling is dus eigenlijk dat hij voor alle producten (zijn er maar 20 dus valt mee !) het gemiddelde cijfer uitrekend zoals ik hierboven heb beschreven en dat hij dan de 5 hoogste scores laat zien.
Nu heb ik alleen nog geen idee hoe ik dit logisch kan aanpakken. Zou iemand mij hiermee op weg kunnen helpen ?
http://www.voorspeldetrend.nl/highscores/
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
SELECT
tabel_producten.naam
(SUM(tabel_rating.cijfer) / COUNT(tabel_rating.*)) AS gemiddelde_score
FROM
tabel_rating
LEFT JOIN
tabel_producten
ON
tabel_rating.ratingid = tabel_producten.ratingid
WHERE
COUNT(tabel_rating.*) > 10
GROUP BY
ratingid
ORDER BY
gemiddelde_score DESC
LIMIT 5
tabel_producten.naam
(SUM(tabel_rating.cijfer) / COUNT(tabel_rating.*)) AS gemiddelde_score
FROM
tabel_rating
LEFT JOIN
tabel_producten
ON
tabel_rating.ratingid = tabel_producten.ratingid
WHERE
COUNT(tabel_rating.*) > 10
GROUP BY
ratingid
ORDER BY
gemiddelde_score DESC
LIMIT 5
PS: Dit is om het gemiddelde te berekenen over producten met minstens 10 ratings
WHERE
COUNT(tabel_rating.*) > 10
En volgens mij kan je beter in plaats van WHERE count(tabel_rating.*) > 10 een HAVING toevoegen aan je GROUP BY, want een AGGREGATE functie hoort normaliter niet thuis in de WHERE clausule.
Gewijzigd op 14/06/2011 13:31:07 door Arjan -
En waarom al die id's? Waarom moet de productentabel een id hebben? En waarom heeft rating een id terwijl de rating zelf ook uniek is (althans dat lijkt me)?
Zou idd niet percee nodig zijn, maar het levert ook niet echt een probleem op lijkt me ?!
Dus leer je aan om het op de goede manier te doen. Kijk per tabel wat uniek is (dat kan ook een combinatie van kolommen zijn) en maak daar de primary key van. Alleen als er geen unieke (serie van) kolom(men) bestaat/bestaan dan gebruik je een id.
Aangezien het een database in opzet is heb ik het veranderd. Nu staat er in de tabel producten de zelfde info als ik in de eerste post beschreef alleen nu is id weg en is naam de belangrijkste. In de rating tabel is id ook weg en wordt vervangen door naam deze zal dan dus vaker voorkomen, deze is gelijk aan het product waarop gestemd wordt ! Hoe zou ik nu het beste de uitvoer kunnen regelen ? Ben al vollop aan het zoeken maar krijg het nog niet voor elkaar een top5 te produceren !
Dus:
Je zal wel het veld "id" moeten behouden in je producten tabel. Alleen is de ratingid in je producten tabel overbodig, aangezien je een relatie kan leggen tussen de producten tabel en de rating tabel middels de id van het product en een veld "productid" in je rating tabel, dus zo:
Tabel producten
id - naam - beschrijving
Tabel rating
id - productid - cijfer - uitleg
De productid in de rating tabel correspondeert met het desbetreffende id van het product in de tabel producten.
Je kan dan middels onderstaande query een top 5 samen stellen (Pieter heeft je al goed op weggeholpen volgens mij):
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
SELECT
p.id AS product_id,
p.naam AS product_naam,
(SUM(r.cijfer) / COUNT(r.id)) AS product_gemiddelde_rating
FROM
producten p
LEFT JOIN
rating r
ON
r.productid = p.id
GROUP BY
p.id,
p.naam
ORDER BY
product_gemiddelde_rating DESC
LIMIT
5
p.id AS product_id,
p.naam AS product_naam,
(SUM(r.cijfer) / COUNT(r.id)) AS product_gemiddelde_rating
FROM
producten p
LEFT JOIN
rating r
ON
r.productid = p.id
GROUP BY
p.id,
p.naam
ORDER BY
product_gemiddelde_rating DESC
LIMIT
5
Gewijzigd op 14/06/2011 17:18:24 door Arjan -
En hoe kan ik nu de top5 weergeven ?
Met die querie denkkkk...
Gewijzigd op 14/06/2011 17:46:04 door Roy Marijnissen