Respuesta súper útil de Blindy, aquí está el código PHP que se basa en él. Algunos pueden resultar útiles. Los resultados serán 4.11 según el ejemplo de OP:
$ratings = array(
5 => 252,
4 => 124,
3 => 40,
2 => 29,
1 => 33
);
function calcAverageRating($ratings) {
$totalWeight = 0;
$totalReviews = 0;
foreach ($ratings as $weight => $numberofReviews) {
$WeightMultipliedByNumber = $weight * $numberofReviews;
$totalWeight += $WeightMultipliedByNumber;
$totalReviews += $numberofReviews;
}
//divide the total weight by total number of reviews
$averageRating = $totalWeight / $totalReviews;
return $averageRating;
}
Cómo construir la matriz de $ ratings anterior
Ejemplo de pseudocódigo, pero que debería funcionar y que explica cómo construir la matriz $ ratings cuando la información se almacena en la base de datos asumiendo que tiene una tabla llamada "ratings" y una columna llamada "rating". En este caso, es 1 unión, necesitaría hacer 4 combinaciones para obtener todas las calificaciones, pero esto debería ayudarlo a comenzar:
SELECT count(c1.rating) as one_star, count(c2.rating) as two_star
FROM ratings c1
LEFT OUTER JOIN
ratings c2
ON
c1.id = c2.id
WHERE
c1.rating = 1
AND
c2.rating = 2
otro enfoque sugerido en los comentarios
SELECT SUM(rating = 1) AS one_s ,SUM(rating = 2) AS two_s ,SUM(rating = 3) as three_s FROM reviews where product_id = 9