根据所有符合条件的行的计数列更新数据库 table 中的百分比列

Update percentage column in database table based on count column of all qualifying rows

我想根据 table 中所有 is_enabled = 1 行的 count 数据更新 percentage 列。

我的编码尝试如下所示:

<?php 
    $total = '';
    $result= mysqli_query($conn, "SELECT SUM(count) FROM My_Databse WHERE is_enabled ='1'");
    while($row = mysqli_fetch_array($result)){
        $total = $row['SUM(count)'];
    }
    
    $percentage = '';
    $result= mysqli_query($conn, "SELECT * FROM My_Database WHERE is_enabled ='1' ORDER BY count DESC");
    while($row = mysqli_fetch_array($result)){
        $percentage = ($row[2] / $total) * 100;
        echo '<div class="progress">';
        echo '<div class="progress-bar" role="progressbar" aria-valuenow="'.$percentage.'" aria-valuemin="0" aria-valuemax="100" style="width:'.$percentage.'%">';
        echo $row[1].'('.round($percentage).')';
        echo '</div>';
        echo '</div>';
        $i++;
    }
    $result = mysqli_query($conn, "UPDATE My_Database SET percentage = ".$percentage." WHERE id = 1");
?>

我现在遇到了问题,我总是得到最后的百分比。如何更新每一行的百分比?

更新查询必须在 while 循环内,计算百分比后 -

mysqli_query($conn, "UPDATE My_Database SET percentage = ".$percentage." WHERE id = ". $row['id'] );

我不建议多次访问您的数据库,也不建议使用 php 来执行可以简单、高效、直接且完全通过单个查询完成的任务。

加入包含所有符合条件的行的 count 总数的派生 table,然后构建算法来计算百分比并相应地更新行。

连接派生的 table 比为每个符合条件的行调用子查询更有效。

代码:(DB-Fiddle)

UPDATE my_table
JOIN (SELECT SUM(`count`) total FROM my_table WHERE is_enabled = 1) all_enabled
SET percentage = ROUND(`count` / total * 100)
WHERE is_enabled = 1;

新table数据:

id tutorial count is_enabled percentage
1 House 3 1 6
2 Car 34 1 68
3 Tuna Fish 22 0 0
4 Bike 13 1 26

根据您的情况(读取和写入此 table 的频率),您可能宁愿声明一个 TRIGGER 以在 countis_enabled 值时自动计算和更新百分比列已更改或插入了 is_enabled 的新行。