在mysql中递减值,但不是负数

2sbarzqh  于 2023-02-21  发布在  Mysql
关注(0)|答案(7)|浏览(158)

我想减少一个值时,用户删除它在php和mysql。我想检查不低于0。如果值是0,那么不要减少

mysql_query("UPDATE table SET field = field - 1 WHERE id = $number");

如果字段为0,则不执行任何操作

e4yzc0pl

e4yzc0pl1#

添加另一个条件,仅当field大于0时更新

UPDATE your_table 
SET field = field - 1
WHERE id = $number
AND field > 0
hk8txs48

hk8txs482#

您可以使用GREATEST()来防止新值降到零以下。如果值降到零以下,零将始终大于计算值,从而防止使用任何小于零的值。

UPDATE  table
SET     field = GREATEST(0, field - 1)
WHERE   id = $number

顺便说一句:请不要再使用mysql_*函数。它们已经过时,最终将从PHP中删除。请改用PDOMySQLi

sqserrrh

sqserrrh3#

使用GREATEST的选项在较新的MySQL版本中不起作用,如果您想更新多个字段而不是一个字段,则接受的答案可能没有用。

UPDATE  table
SET     field = IF(field > 0, field - 1, 0)
WHERE   id = $number
qacovj5a

qacovj5a4#

UPDATE table SET field = case when (field - 1) >0 then (field - 1)
else field end
WHERE id = $number
zf2sa74q

zf2sa74q5#

UPDATE `table_name` SET field = field-1 WHERE `id` = '".$id."' AND field > 0

注意:字段的数据类型应为INTEGER。

iqxoj9l9

iqxoj9l96#

如果字段是int型无符号字段,则最好如下所示:

UPDATE table 
SET field = field - 1
WHERE id = $number
and field > 0

# or
UPDATE  table
SET     field = IF(field > 0, field - 1, 0)
WHERE   id = $number
o4hqfura

o4hqfura7#

对于用PDO快速搜索示例的人...

<?php

/**
 * Class Set_quantity_product
 */
 class Set_quantity_product {
    
    
  /**
    * Set_quantity_product::update_quant_prod( $id, $number, $to_do );
    *
    * @param  {int} $id        a product id
    * @param  {int} $number    a number to increment or decrement for a value in DB
    * @param  {str} $to_do     'incr/decr'
    * @return {void}           increment or decrement but always return 0 if quant < 0
    */
    public static function update_quant_prod( $id, $number, $to_do ){
    
       $DATA_BASE = new PDO('mysql:host='.$YOUR_HOST.';dbname='.$YOUR_DB_NAME.';charset=utf8', $YOUR_USER_NAME, $YOUR_DB_PASSWORD, array( PDO::ATTR_PERSISTENT => false));
    
       // Note:
       // UPDATE  products
       // SET     quant = GREATEST( 0, quant+:ope )
       // WHERE   id = :id
       // increm or decrement but do nothing if quant is > quant in DB
    
       // pass quant number to affect to negative for decrement
       $number = ( $to_do == 'decr' ) ? $number*-1 : $number;
    
       // UPDATE ONE PROD. QUANT. 'ope' -> calcul operation
       $ARR_pdo = array( 'id' => (int) $id,
                            'ope' => $number );
       $sql = 'UPDATE products SET
          quant = IF(quant+:ope >= 0, quant+:ope, 0) WHERE id=:id';
    
       // prepa. SQL
       $request = $DATA_BASE->prepare($sql);
    
       // exec. request
       $request->execute($ARR_pdo);
    
       // PDO closeCursor
       $request->closeCursor();
    
       // return true for test
       return true;
   }
   /**
    * Set_quantity_product::update_quant_prod( $id, $number, $to_do );
    */
    
 }
 /**
  * Class Set_quantity_product
  */

?>

用途:(假设您有一个id=42的产品)

Set_quantity_product::update_quant_prod( 42, 5, 'decr' );

如果您在DB中的数量是6 -〉,则将该值设置为1
如果您在DB中的数量是5 -〉,则将该值设置为0
如果您在DB中的数量是4 -〉,则将该值设置为0

相关问题