如果在另一列中不存在,则如何更新第一个NULL列

时间:2018-06-07 01:17:00

标签: php mysql

我想运行一个mysql查询来搜索和更新表levels中的第一个空列,其中uid1uid2uid3,{{ 1}}列不等于myUniqueID。

以下是我的表格的简化版本,内容为:

uid4

这是我的问题:

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,此查询将更新第4行的第11111111111列,并将其设置为uid2。就像这样:

11111111111

问题是内部 IF 始终返回 FALSE ,因此表格不会更改。

问题1:有人能找到解决方法吗?

问题2:如何判断MySQL UPDATE成功与实际更新的数据有关?

1 个答案:

答案 0 :(得分: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' 

DEMO

问题2:您可以在SELECT ROW_COUNT();查询后使用UPDATE来查找已更新的行数。如果没有更新,则会返回0