我想运行一个mysql查询来搜索和更新表levels
中的第一个空列,其中uid1
,uid2
,uid3
,{{ 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成功与实际更新的数据有关?
答案 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'
问题2:您可以在SELECT ROW_COUNT();
查询后使用UPDATE
来查找已更新的行数。如果没有更新,则会返回0
。