【问题标题】:Convert SQL UPDATE statement to php with if else condition (codeigniter)使用 if else 条件(codeigniter)将 SQL UPDATE 语句转换为 php
【发布时间】:2015-09-20 18:19:53
【问题描述】:

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

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

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

连接列“ID_STATUS”与列“lama”和“estimasi

我的餐桌名称是“pelayanan”。

ID_STATUS 是表“状态”中的 PK。

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

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

条件一:

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)。

怎么会这样?

【问题讨论】:

    标签: php mysql codeigniter


    【解决方案1】:

    你的第一个查询是

    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);
    

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

    【讨论】:

      【解决方案2】:

      条件 3:

      • a.LAMAESTIMASI 均为空。
      • b. 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`');
      

      【讨论】:

      • LAMAESTIMASI 不为 NULL。我想让那个查询变成 php 代码(Codeigniter)
      • 当我在 sql 中执行该查询时,结果为错误。 #1064 - 您的 SQL 语法有错误;检查与您的 MySQL 服务器版本相对应的手册,以在第 4 行的 'BE = p.ESTIMASI THEN '2' WHEN p.LAMA p.ESTIMASI THEN '1' ' 附近使用正确的语法
      • 很好奇,我在 MySQL 查询示例中没有看到任何字符串 BE。我不知道那个字符串是从哪里来的。
      猜你喜欢
      • 2019-04-09
      • 1970-01-01
      • 2012-07-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多