Bezoekers van mijn webwinkel kunnen bij elke product voor enkele criteria cijfers achterlaten en een review achterlaten. Nu heb ik ook een productoverzicht waar alle producten uit een categorie getoond worden. Hierbij staan dan ook per product het aantal reviews en de gemiddelde beoordeling. Dat heb ik nu gewoon werkend en het werkt (vooralsnog) ook gewoon snel.
Ik heb het overigens als eerst met JOINS geprobeerd, maar daar stuitte ik op problemen. Het aantal werd dan namelijk niet meer goed geteld. Daarna heb ik via een forum een oplossing gevonden. Deze staat hieronder:
SELECT p.naam AS product,
p.modnaam AS product_modnaam,
(
SELECT ROUND(AVG(waarde), 1 )
FROM cijfer
WHERE review_id
IN (
SELECT id
FROM review
WHERE product_id = p.id
)
)
AS gemiddelde,
(
SELECT COUNT( id )
FROM review
WHERE product_id = p.id
)
AS aantal
FROM product p
WHERE categorie_id = '19'
Zoals ik al eerder zei werkt dit tot nu toe gewoon erg goed. Ik heb echter gelezen dat het nog beter zou kunnen door gebruik te maken van derived tables ofzo? Zou iemand mij kunnen vertellen of dit ook daadwerkelijk zo is?
Dit is al een deel ervan wat ik tot nu toe al heb (geprobeerd):
SELECT *
FROM product
// Hieronder aantal reviews per product tellen
LEFT JOIN (
SELECT product_id, COUNT( * ) AS aantal
FROM review
GROUP BY product_id
) AS telling ON telling.product_id = product.id
Ik weet echter niet hoe ik hierbij ook nog de SQL kan zetten om het gemiddelde van de reviews per product weer te geven. Weet iemand het antwoord hierop?
Toelichting databasemodel:
Product (id, naam, merk_id, categorie_id)
Cijfer (waarde, criterium_id, review_id)
Review (id, naam, e-mail, toelichting, datum, product_id)
1.007 views