PHP / Mysql:优化查询

时间:2014-12-03 11:11:13

标签: php mysql mysqli

我有以下脚本从2个表中检索数字,进行求和,并将值更新为第3个表。

$query = "SELECT (SELECT SUM(net_amount) FROM fin_costos WHERE month='1' AND group_of_costos='general' AND year_analysis='2014' ) + 
(SELECT SUM(net_amount) FROM em2_fin_costs WHERE month='1' AND group_of_costos='general' AND year_analysis='2014') AS total";

$result = mysqli_query($mysqli,$query);

while($row = mysqli_fetch_array($result)){$valor_final = $row['total']; }

$query_update="UPDATE fusion_analysis SET jan='$valor_final' WHERE year_for_analysis='2014' AND item_for_analysis='general' AND category='general'"; 
$result = mysqli_query($mysqli,$query_update);

我需要为一年中的每个月运行相同的脚本。一切都是相同的,除了从1到12变化的变量'month'和UPDATE中每个月上传值的SET('jan','feb','mar'等等)

我目前只是复制并粘贴相同的脚本来更改这几个参数,但我相信有一种更聪明的方法可以用更少的代码行来实现这一点

1 个答案:

答案 0 :(得分:0)

参见PHP的日期函数:

$query = "SELECT (SELECT SUM(net_amount)"
    . " FROM fin_costos"
    . " WHERE month='".date('n')."'"
    ." AND group_of_costos='general' AND year_analysis='".date("Y")."' ) +"
    ."(SELECT SUM(net_amount) FROM em2_fin_costs WHERE month='".date('n')."'"
    . " AND group_of_costos='general' AND year_analysis='".date("Y")."') AS total";

$query_update="UPDATE fusion_analysis"
    . " SET `".  strtolower(date('M'))."`='$valor_final'"
    . " WHERE year_for_analysis='".date("Y")."'"
    . " AND item_for_analysis='general'"
    . " AND category='general'"; 

注意:

Y - 一年的完整数字表示,如2014年的4位数

n - 一个月的数字表示,不带前导1 - 12

M - 一个月的简短文字表示,三个字母1月到12月

月份作为短文本,我使用strtolower函数将其设为小写。

更新

基于OP评论:

for ($i = 1; $i <= 12; $i++) {
    $query = "SELECT (SELECT SUM(net_amount)"
        . " FROM fin_costos"
        . " WHERE month='" . $i . "'"
        . " AND group_of_costos='general' AND year_analysis='" . date("Y") . "' ) +"
        . "(SELECT SUM(net_amount) FROM em2_fin_costs WHERE month='" . $i . "'"
        . " AND group_of_costos='general' AND year_analysis='" . date("Y") . "') AS total";

    $result = mysqli_query($mysqli, $query);
    $row = mysqli_fetch_assoc($result);

    $valor_final = $row['total'];

    $monthName = strtolower(date('M', strtotime(date("Y") . "-" . str_pad($month,2, "0", STR_PAD_LEFT) . "-" . date("01") )));

    $query_update = "UPDATE fusion_analysis"
        . " SET `" . $monthName . "`=' " . $valor_final . "'"
        . " WHERE year_for_analysis='" . date("Y") . "'"
        . " AND item_for_analysis='general'"
        . " AND category='general'";
    mysqli_query($mysqli, $query_update);
}