I have a system of valuation of stars of products equivalent of medium and whole
Example:
0.5
- 1
- 1.5
- 2
- 2.5
- 3
- 3.5
- 4
- 4.5
- 5
I get the data correctly taking two data a medium and whole and sum both values
From the following consultation:
//we define in a variable the id of the product valued by the valuation system
$id_product = 1;
//we obtain an average and integer value equivalent to 4.5 and 5
$stmt = $con->prepare("SELECT SUM(rating) as total FROM ratings WHERE id_product=? AND rating in(4.5,5)");
$stmt->bind_param("i",$id_product);
$stmt->execute();
$stmt->bind_result($sum);
while ($stmt->fetch()) {
echo $sum;
}
//we obtain an average and integer value equivalent to 3.5 and 4
$stmt = $con->prepare("SELECT SUM(rating) as total FROM ratings WHERE id_product=? AND rating in(3.5,4)");
$stmt->bind_param("i",$id_product);
$stmt->execute();
$stmt->bind_result($sum);
while ($stmt->fetch()) {
echo $sum;
}
//we obtain an average and integer value equivalent to 2.5 and 3
$stmt = $con->prepare("SELECT SUM(rating) as total FROM ratings WHERE id_product=? AND rating in(2.5,3)");
$stmt->bind_param("i",$id_product);
$stmt->execute();
$stmt->bind_result($sum);
while ($stmt->fetch()) {
echo $sum;
}
//we obtain an average and integer value equivalent to 1.5 and 2
$stmt = $con->prepare("SELECT SUM(rating) as total FROM ratings WHERE id_product=? AND rating in(1.5,2)");
$stmt->bind_param("i",$id_product);
$stmt->execute();
$stmt->bind_result($sum);
while ($stmt->fetch()) {
echo $sum;
}
//we obtain an average and integer value equivalent to 0.5 and 1
$stmt = $con->prepare("SELECT SUM(rating) as total FROM ratings WHERE id_product=? AND rating in(0.5,1)");
$stmt->bind_param("i",$id_product);
$stmt->execute();
$stmt->bind_result($sum);
while ($stmt->fetch()) {
echo $sum;
}
now my question is how can I correctly calculate the data in percentages and get a result like the following image:
The percentages in that table are based on counts, not sums of the rating values.
You can do all this in one query, you don't need separate queries for each valuation range.
$stmt = $con->prepare('
SELECT SUM(rating IN (4.5, 5))/COUNT(*)*100 AS pct_5_star,
SUM(rating IN (3.5, 4))/COUNT(*)*100 AS pct_4_star,
SUM(rating IN (2.5, 3))/COUNT(*)*100 AS pct_3_star,
SUM(rating IN (1.5, 2))/COUNT(*)*100 AS pct_2_star,
SUM(rating IN (0.5, 1))/COUNT(*)*100 AS pct_1_star,
AVG(rating) AS avg_rating
FROM ratings
WHERE id_product = ?');
$stmt->bind_param('i', $id_product);
$stmt->execute();
$percents = array(;
$stmt->bind_result($percents[5], $percents[4], $percents[3], $percents[2], $percents[1], $avg_rating);
if ($stmt->fetch()) {
for ($i in array(5, 4, 3, 2, 1)) {
echo "%i stars: " . round($percents[$i]) . "%<br>";
}
echo "Average rating: $avg_rating<br>";
} else {
echo "This product is not yet rated<br>";
}
The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.