【问题标题】:Update same column on multiple rows with different values用不同的值更新多行的同一列
【发布时间】:2015-05-27 21:06:17
【问题描述】:

我想每天运行cron job 来更新dadmin_reminder_datedshipment_datedarrival_date。我需要将icmd_days 添加到每个当前日期。

例如。对于第二行(无法上传图片) 输出应该是 old(05/07/2015)/new(06/04/2015),old(05/07/2015)/new(06/04/2015),old(05/15/2015)new(06/12/2015)。此行的icmd_days = 28。每行都有不同的天数或icmd_days 值。

这是我目前拥有的php 代码,但是它更新每一行的天数相同。

require '../commonincludefiles.php';

global $conn;

$row_string = '';

$Today = date("Y-m-d");

global $conn;



$sub_query = "SELECT bisubscriptionID,dshipment_date,darrival_date,icmd_days,dadmin_reminder_date,vsubscriptionstatus FROM tbl_subscription WHERE darrival_date <= '".$Today."' AND edelete='0' AND vsubscriptionstatus='Shipped'";
$sub_res = mysqli_query($conn,$sub_query);
    $temp = array();
    if (mysqli_num_rows($sub_res) >0) {
    $i=0;
    while($row =  mysqli_fetch_array($sub_res)){
        $temp[$i]['bisubscriptionID'] = $row['bisubscriptionID'];
        $temp[$i]['icmd_days'] = $row['icmd_days'];
        $temp[$i]['new_dshipment_date'] = date('Y-m-d', strtotime($row['dshipment_date'] . '+ '.$row['icmd_days'].'days'));
        $i++;



$new_vsubscriptionstatus = 'Active';


$update_query = "UPDATE tbl_subscription SET vsubscriptionstatus='" . $new_vsubscriptionstatus . "',dshipment_date='" . $new_dshipment_date . "',tmodifydate=NOW() WHERE darrival_date <= '".$Today."' AND edelete='0' AND vsubscriptionstatus='Shipped' AND bisubscriptionID= $bisubscriptionID";
$update_res = mysqli_query($conn, $update_query);
}
}
?>

请对我放轻松。我以前从未编写过代码,并获得了一个有趣的网站。

【问题讨论】:

    标签: php sql multiple-columns


    【解决方案1】:

    因此,您可以将更新语句更改为如下所示,并一起删除您的选择:

    UPDATE tbl_subscription 
    SET vsubscriptionstatus = '" . $new_vsubscriptionstatus . "'
        ,dshipment_date=DATEADD(d,icmd_days,shipment_date)
        ,tmodifydate=NOW() 
    WHERE darrival_date <= '".$Today."' 
    AND edelete='0' 
    AND vsubscriptionstatus='Shipped' 
    AND bisubscriptionID= $bisubscriptionID
    

    Date add 会自动将 ICMD_DAYS 中的天数添加到 shipping_date 中,并相应地设置您的日期。

    您还可以删除 SQL 中内置 GETDATE() 函数的今天逻辑:

    UPDATE tbl_subscription 
    SET vsubscriptionstatus = '" . $new_vsubscriptionstatus . "'
        ,dshipment_date=DATEADD(d,icmd_days,shipment_date)
        ,tmodifydate=NOW() 
    WHERE darrival_date <= GETDATE()
    AND edelete='0' 
    AND vsubscriptionstatus='Shipped' 
    AND bisubscriptionID= $bisubscriptionID
    

    我猜你使用的是 MySQL 而不是 SQL Server。以下是如何在 MySQL 中执行此操作。我还为我在服务器上创建的名为 stackoverflow 的模式编写了示例代码。

    我包含了 drop table,以防您想在任何调整后重新运行代码。

    USE stackoverflow;
    
    DROP TABLE `tbl_subscription`;
    
    CREATE TABLE `tbl_subscription` (
      `dshipment_date` DATE NULL,
      `icmd_days` INT NULL,
      `darrival_date` DATETIME NULL,
      `edelete` BIT NULL,
      `csubscriptionstatus` VARCHAR(45) NULL,
      `bisubscriptionID` BIGINT NULL,
      `dadmin_reminder_date` DATE NULL,
      `dprevious_shipment_date` DATE NULL,
      `tmodifydate` DATETIME NULL
      )
    ENGINE = InnoDB;
    
    
    INSERT INTO `tbl_subscription`
        (
        dshipment_date
        ,icmd_days
        ,darrival_date
        ,edelete
        ,csubscriptionstatus
        ,bisubscriptionID
        ,dadmin_reminder_date
        ,tmodifydate
        )
    
    SELECT 
        '2015-04-30' as dshipment_date
        ,30 as icmd_days
        ,null as darrival_date
        ,0 as edelete
        ,'Shipped' as csubscriptionstatus
        ,20150001 as bisubscriptionID
        ,null as dadmin_reminder_date
        ,NOW() as tmodifydate 
    UNION ALL
    SELECT 
        '2015-05-10' as dshipment_date
        ,25 as icmd_days
        ,null as darrival_date
        ,0 as edelete
        ,'Shipped' as csubscriptionstatus
        ,20150002 as bisubscriptionID
        ,null as dadmin_reminder_date
        ,NOW() as tmodifydate 
    UNION ALL 
    SELECT 
        '2015-04-10' as dshipment_date
        ,30 as icmd_days
        ,'2015-04-13' as darrival_date
        ,0 as edelete
        ,'Shipped' as csubscriptionstatus
        ,20150003 as bisubscriptionID
        ,null as dadmin_reminder_date
        ,NOW() as tmodifydate 
    UNION ALL 
    SELECT 
        '2015-05-25' as dshipment_date
        ,20 as icmd_days
        ,'2015-05-28' as darrival_date
        ,0 as edelete
        ,'Active' as csubscriptionstatus
        ,20150004 as bisubscriptionID
        ,null as dadmin_reminder_date
        ,NOW() as tmodifydate 
    UNION ALL 
    SELECT 
        '2015-04-27' as dshipment_date
        ,20 as icmd_days
        ,'2015-04-30' as darrival_date
        ,0 as edelete
        ,'Shipped' as csubscriptionstatus
        ,20150005 as bisubscriptionID
        ,null as dadmin_reminder_date
        ,NOW() as tmodifydate 
    ;
    
    SELECT * FROM `tbl_subscription`;
    
    SELECT dshipment_date,icmd_days,DATE_ADD(dshipment_date, INTERVAL icmd_days DAY) FROM `tbl_subscription`;
    
    
    UPDATE `tbl_subscription`
    SET dprevious_shipment_date = dshipment_date
        ,csubscriptionstatus = 'Active'
        ,dshipment_date=DATE_ADD(dshipment_date, INTERVAL icmd_days DAY)
        ,tmodifydate = NOW()
    WHERE darrival_date <= NOW()
    AND edelete='0' 
    AND csubscriptionstatus='Shipped' 
    /*AND bisubscriptionID= $bisubscriptionID -- this is not needed since we are not doing the loop anymore -- */
    ;
    
    SELECT * FROM `tbl_subscription`;
    

    但您需要的基本代码如下:

    USE stackoverflow;
    UPDATE `tbl_subscription`
    SET dprevious_shipment_date = dshipment_date
        ,csubscriptionstatus = 'Active'
        ,dshipment_date=DATE_ADD(dshipment_date, INTERVAL icmd_days DAY)
        ,tmodifydate = NOW()
    WHERE darrival_date <= NOW()
    AND edelete='0' 
    AND csubscriptionstatus='Shipped' 
    /*AND bisubscriptionID= $bisubscriptionID -- this is not needed since we are not doing the loop anymore -- */
    

    并且此代码将消除您的循环设置 csubscriptionstatus 值的需要。

    我在您的表格中添加了一个字段 dprevious_shipment_date 作为日期,以便您可以跟踪上个月发货的时间,以防您需要它进行恢复,如果需要,您也可以将其从更新声明中删除。

    【讨论】:

    • 感谢您的快速回复,我今晚下班后检查。
    • 太棒了,如果这不起作用,请告诉我。如果确实如此,请将其标记为已回答:-) 我正在努力提高我的分数,以便在我有问题时可以按照之前建议的 woot 发表评论:-)
    • DateAdd() 是一个未定义的函数。我应该提到这是一个 .php 文件
    • 这是用于 mysql 还是 SQL Server?
    • 好的,我为您设置了对我原始答案的编辑。如果您愿意,可以使用上面的代码在您的 MySQL 服务器上进行测试,或者只是尝试更新语句。我不确定,但我将 vsubscriptionstatus 重命名为 csubscriptionstatus 但我不确定这是否是您需要的,所以如果您愿意,请随时将其重命名。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-22
    • 2023-01-11
    • 1970-01-01
    • 2012-11-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多