mysql обновление с if и max - PullRequest
       19

mysql обновление с if и max

0 голосов
/ 14 марта 2020

Я потерял часы на этом, и у меня ничего не работает.

Я подал strp_aa по умолчанию NULL. Поле strp_aa должно обновляться только в том случае, если его значение NULL равно MAX strp_aa + 1, и если оно не равно нулю, если у него уже есть номер, оно должно оставаться прежним.

короткая версия кода

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;

Я пробовал несколько вещей, подобных этой, упомянутой здесь Обновление 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 

1 Ответ

1 голос
/ 14 марта 2020

Для этого можно использовать синтаксис 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_aa по всей таблице. Предложение where исключает строку (и), где strp_aa не равно null.

...