繁体   English   中英

使用 if else 条件将 SQL UPDATE 语句转换为 php (codeigniter)

[英]Convert SQL UPDATE statement to php with if else condition (codeigniter)

我想在 Codeigniter 中使用 SQL 更新语句制作 php 代码。

如果我在 Codeigniter 中执行代码,数据库中的数据也会更新。

我想更新一列 (ID_STATUS) 但有几个条件。

连接列 ' ID_STATUS ' 与列 ' lama ' 和 ' estimasi '

我的表名是“pelayanan”。

ID_STATUS是来自表“状态”的 PK。

因此,表“pelayanan”中的列ID_STATUS是表“status”中的外键。

我试过这个查询,但是,还不是 if else 条件。

条件 1:

UPDATE `dbhpl`.`pelayanan` 
SET `pelayanan`.`ID_STATUS` = '1' 
WHERE `pelayanan`.`LAMA` <> `pelayanan`.`ESTIMASI`;

条件2:

UPDATE `dbhpl`.`pelayanan` 
SET `pelayanan`.`ID_STATUS` = '2' 
WHERE `pelayanan`.`LAMA` = `pelayanan`.`ESTIMASI`;

那是对mysql的查询。 但我想将该查询转换为 php 代码(Codeigniter)。

怎么会呢?

条件 3:

  • 一种。 LAMAESTIMASI都为空。
  • LAMA为空
  • C。 ESTIMASI为空

如果您想根据LAMAESTIMASI的值更新表中的所有行,您可以使用一个 UPDATE 语句一举完成。

  UPDATE `dbhpl`.`pelayanan` p 
     SET p.`ID_STATUS`
         = CASE 
             WHEN p.`LAMA`  = p.`ESTIMASI` THEN '2'
             WHEN p.`LAMA` <> p.`ESTIMASI` THEN '1'
             WHEN p.`LAMA` IS NULL AND p.`ESTIMASI` IS NULL THEN p.`ID_STATUS`
             WHEN p.`LAMA` IS NULL THEN p.`ID_STATUS`
             ELSE p.`ID_STATUS`
           END  

请注意,将ID_STATUS列的当前值分配回ID_STATUS列会导致“无更新”。

由于最后两个 WHEN 条件返回与 ELSE 相同的值,因此可以删除这些值。 包括这些只是为了说明条件 3 的可能处理。

这与原始版本的一个小区别是它会尝试更新表中的每一行,包括在LAMA和/或ESTIMASI中具有 NULL 值的行。 这意味着将为这些行触发任何 UPDATE 触发器。 要获得与原始结果完全相同的结果,您需要包含一个WHERE子句,该子句排除LAMA为空或ESTIMASI为空的行。 例如:

   WHERE p.`LAMA` IS NOT NULL
     AND p.`ESTIMASI` IS NOT NULL  

至于如何在 PHP 中完成同样的事情,其他人可能能够回答。 就个人而言,我只会做一个 SQL 操作。

ANSI 标准语法有点冗长。 完成相同操作的 MySQL 特定版本要短一些:

  UPDATE `dbhpl`.`pelayanan` p 
     SET p.`ID_STATUS` = IFNULL((p.`LAMA`=p.`ESTIMASI`)+1,p.`ID_STATUS`)

跟进

如果LAMAESTIMASI被定义为NOT NULL ,那么您就不必处理条件 3 (在更一般的情况下,我们不一定有这种保证,所以我认为考虑这些情况是更好的模式,即使它们在我们的特定情况下永远不会发生。

对于 CodeIgniter ActiveRecord,你可以尝试这样的事情:

 $this->db
   ->set('ID_STATUS', 'IFNULL((`LAMA`=`ESTIMASI`)+1,`ID_STATUS`)', FALSE)
   ->update('`dbhpl`.`pelayanan`');

你的第一个查询是

UPDATE `dbhpl`.`pelayanan` 
SET `pelayanan`.`ID_STATUS` = '1' 
WHERE `pelayanan`.`LAMA` <> `pelayanan`.`ESTIMASI`;

将其转换如下:

$update_data=array('ID_STATUS'=>'1');
$this->db->where('LAMA <>','ESTIMASI');
$this->db->update('pelayanan',$update_data);

你的第二个查询是

UPDATE `dbhpl`.`pelayanan` 
SET `pelayanan`.`ID_STATUS` = '2' 
WHERE `pelayanan`.`LAMA` = `pelayanan`.`ESTIMASI`;

将其转换如下:

$update_data=array('ID_STATUS'=>'2');
$this->db->where('LAMA','ESTIMASI');
$this->db->update('pelayanan',$update_data);

我已经删除了数据库名称。 数据库名称将在连接中选择,并且确实需要在此处提及它。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

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