首页 > 解决方案 > mysql 用 if 和 max 更新

问题描述

我在这件事上浪费了几个小时,没有什么对我有用。

我已经提交了默认为 NULL 的 strp_aa。归档的 strp_aa 仅在其为 MAX strp_aa + 1 为 null 时才应更新,并且如果它不是 null 如果它已经有一个数字,则它应该保持不变。

代码的简短版本是

UPDATE STRANKEP
SET strp_aa = IF(strp_aa=null, strp_aa+1, strp_aa)
WHERE strp_ID=36;

也累

UPDATE STRANKEP
                SET strp_aa = IF(strp_aa=null, (SELECT MAX(strp_aa)) +1, (SELECT (strp_aa) WHERE strp_ID=36)
                WHERE strp_ID=36;

我尝试了多种方法,例如此处提到的使用 if 条件更新 MySQL

UPDATE STRANKEP
SET strp_aa = CASE WHEN strp_aa = NULL THEN  MAX(strp_aa) + 1 ELSE strp_aa END
WHERE strp_ID = 36;

我还发现这个mysql 查询将字段更新为 max(field) + 1并尝试了提供答案的各种组合,但它对我不起作用。其中一个版本是:

    UPDATE STRANKEP
                    SET strp_aa = IF((SELECT strp_aa )!=null,((SELECT selected_value2 FROM (SELECT (strp_aa) AS selected_value2 FROM STRANKEP WHERE strp_ID=36) AS sub_selected_value2)), ((SELECT selected_value FROM (SELECT MAX(strp_aa) AS selected_value FROM STRANKEP) AS sub_selected_value) + 1)  )
                    WHERE strp_ID=36;

即使在 strp_aa 上设置了一个数字,这也只是继续添加一个......我不知道还能尝试什么。

编辑: @GMB 的答案没有什么问题,因为所有字段都以 NULL 开头,所以 max(strp_aa) 给出 0 结果,以防所有字段中都没有数字。我用 COALESCE 语句解决了这个问题,如果有人有类似的问题,我把它贴在这里。

UPDATE STRANKEP t
CROSS JOIN (select COALESCE(MAX(strp_aa),0) max_strp_aa from STRANKEP) m
set t.strp_aa = m.max_strp_aa + 1
where t.strp_ID = 36 and t.strp_aa is null 

标签: mysqlsqljoinsql-updatemax

解决方案


您可以使用以下update ... join语法:

update strankep s
cross join (select max(strp_aa) max_strp_aa from strankep) m
set s.strp_aa = m.max_strp_aa + 1
where s.strp_id = 36 and s.strp_aa is null

带来了整个表的cross join最大值。strp_aawhere子句消除了strp_aa不是的行null


推荐阅读