简体   繁体   中英

how to calculate the correct percentage of a valuation system of products?

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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM