Blindy による非常に役立つ返信です。これに基づいた PHP コードを次に示します。役立つものもあるかもしれません。OPの例によると、結果は4.11になります。
$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;
}
上記の $ratings 配列を構築する方法
疑似コードの例ですが、「ratings」というテーブルと「rating」という列があると仮定して、DB に情報が格納されている場合に $ratings 配列を作成する方法を説明しています。この場合は 1 つの結合です。すべての評価を取得するには 4 つの結合を行う必要がありますが、これで開始できます。
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
コメントで提案された別のアプローチ
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