Я хочу запустить запрос 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 было успешным, по сравнению с фактически обновленными данными?






Вы тестируете 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.
секция IF ('$myUniqueID' not in (uid1,uid3,uid4) всегда возвращает ЛОЖНЫЙ
Необходимо использовать IFNULL() в проверках NOT IN. В противном случае пустые значения приведут к сбою этих проверок.
Спасибо за ответ. а как Выберите из обновить строку?
SELECT * FROM levels WHERE '$myUniqueID' IN (uid1, uid2, uid3, uid4).
Я знаю это. А вот '$myUniqueID' можно найти в нескольких рядах.
Нет встроенного способа узнать, какие строки были только что обновлены. Вы можете сначала выполнить запрос SELECT, чтобы найти строки, соответствующие критериям, которые необходимо обновить.
Из названия я предположил, что $myUniqueID уникален, поэтому все строки, в которых он есть, были только что обновленными.
Ваш код достаточно правильный. Но таблица не изменилась