Как обновить первый столбец NULL, если он не существует в другом столбце

Я хочу запустить запрос mysql для поиска и обновления первого нулевого столбца из таблицы levels, где значение столбцов uid1, uid2, uid3, uid4 не равно myUniqueID.

Вот упрощенная версия моей таблицы с содержимым:

mysql> select * from levels;
+----+--------------+--------------+----------------+-----------------+-----------------------------------------+
| level_id|        uid1    |      uid2      |      uid3      |      uid4      |      status    |      level     |
+----+--------------+--------------+----------------------------------------------------------------------------+
|    1    | 576da2176b9867 | 57709be6486012 | 57709be6006055 | 57709be6486077 |     closed     |     level9     |
|    2    | 57709be6486012 | 577c132ed56645 | 57709be0000044 | 57709be6486033 |     closed     |     level5     |
|    3    | 577c132ed56645 | 577c1339f34e11 | 57709be6486002 | 57709be6486011 |     running    |     level3     |
|    4    | 577c1339f34e11 |     NULL       |      NULL      |      NULL      |     opened     |     level2     |
+----+--------------+--------------+----------------------------------------------------------------------------+

Вот мой запрос:

UPDATE `levels` set 
`uid1`=IF(`uid1` IS NULL, IF ('$myUniqueID' not in (`uid2`,`uid3`,`uid4`),'$myUniqueID', NULL ), `uid1`),
`uid2`=IF(`uid1` IS NULL, IF ('$myUniqueID' not in (`uid1`,`uid3`,`uid4`),'$myUniqueID', NULL ), `uid2`),
`uid3`=IF(`uid1` IS NULL, IF ('$myUniqueID' not in (`uid2`,`uid1`,`uid4`),'$myUniqueID', NULL ), `uid3`),
`uid4`=IF(`uid1` IS NULL, IF ('$myUniqueID' not in (`uid2`,`uid3`,`uid1`),'$myUniqueID', NULL ), `uid4`)
WHERE  levels.`status` ='opened'  and  levels.level = 'level2' 

Предполагая, что $myUniqueID имеет значение 11111111111, этот запрос обновит столбец uid2 строки 4 и установит его в 11111111111. КАК ЭТО:

+----+--------------+--------------+----------------+-----------------+-----------------------------------------+
| level_id|        uid1    |      uid2      |      uid3      |      uid4      |      status    |      level     |
+----+--------------+--------------+----------------------------------------------------------------------------+
|    1    | 576da2176b9867 | 57709be6486012 | 57709be6006055 | 57709be6486077 |     closed     |     level9     |
|    2    | 57709be6486012 | 577c132ed56645 | 57709be0000044 | 57709be6486033 |     closed     |     level5     |
|    3    | 577c132ed56645 | 577c1339f34e11 | 57709be6486002 | 57709be6486011 |     running    |     level3     |
|    4    | 577c1339f34e11 |  111111111111  |      NULL      |      NULL      |     opened     |     level2     |
+----+--------------+--------------+----------------------------------------------------------------------------+

Проблема в том, что внутренний ЕСЛИ всегда возвращает ЛОЖНЫЙ, поэтому таблица не изменяется.

Вопрос 1 : Может кто-нибудь найти решение этого?

Вопрос 2 : Как узнать, когда ОБНОВЛЕНИЕ MySQL было успешным, по сравнению с фактически обновленными данными?

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
0
0
43
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вы тестируете uid1 IS NULL в каждом задании. Он должен проверить, все ли предыдущие столбцы - это NOT NULL, а сам IS NULL.

UPDATE `levels` set 
    `uid1`=IF(`uid1` IS NULL, IF ('$myUniqueID' not in (IFNULL(`uid2`, ''),IFNULL(`uid3`, ''),IFNULL(`uid4`, '')),'$myUniqueID', NULL ), `uid1`),
    `uid2`=IF(`uid1` IS NOT NULL AND `uid2` IS NULL, IF ('$myUniqueID' not in (`uid1`,IFNULL(`uid3`, ''),IFNULL(`uid4`, '')),'$myUniqueID', NULL ), `uid2`),
    `uid3`=IF(`uid1` IS NOT NULL AND `uid2` IS NOT NULL AND `uid3` IS NULL, IF ('$myUniqueID' not in (`uid2`, `uid1`,IFNULL(`uid4`, '')),'$myUniqueID', NULL ), `uid3`),
    `uid4`=IF(`uid1` IS NOT NULL AND `uid2` IS NOT NULL AND `uid3` IS NOT NULL AND `uid4` IS NULL, IF ('$myUniqueID' not in (`uid2`, `uid3`, `uid1`),'$myUniqueID', NULL ), `uid4`)
WHERE  levels.`status` ='opened'  and  levels.level = 'level2' 

ДЕМО

Вопрос 2: Вы можете использовать SELECT ROW_COUNT(); после запроса UPDATE, чтобы узнать, сколько строк было обновлено. Если ничего не обновлялось, возвращается 0.

Ваш код достаточно правильный. Но таблица не изменилась

Iman Marashi 07.06.2018 03:35

секция IF ('$myUniqueID' not in (uid1,uid3,uid4) всегда возвращает ЛОЖНЫЙ

Iman Marashi 07.06.2018 03:37

Необходимо использовать IFNULL() в проверках NOT IN. В противном случае пустые значения приведут к сбою этих проверок.

Barmar 07.06.2018 16:41

Спасибо за ответ. а как Выберите из обновить строку?

Iman Marashi 19.06.2018 04:41
SELECT * FROM levels WHERE '$myUniqueID' IN (uid1, uid2, uid3, uid4).
Barmar 19.06.2018 16:59

Я знаю это. А вот '$myUniqueID' можно найти в нескольких рядах.

Iman Marashi 19.06.2018 20:40

Нет встроенного способа узнать, какие строки были только что обновлены. Вы можете сначала выполнить запрос SELECT, чтобы найти строки, соответствующие критериям, которые необходимо обновить.

Barmar 19.06.2018 21:43

Из названия я предположил, что $myUniqueID уникален, поэтому все строки, в которых он есть, были только что обновленными.

Barmar 19.06.2018 21:44

Другие вопросы по теме