[英]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:
LAMA
和ESTIMASI
都为空。LAMA
为空ESTIMASI
为空如果您想根据LAMA
和ESTIMASI
的值更新表中的所有行,您可以使用一个 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`)
跟进
如果LAMA
和ESTIMASI
被定义为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.