废话不多说,直接看SQL:
UPDATE
lb_user u
SET u.user_level = (
SELECT
IFNULL(levelid, u.user_level)
FROM lb_user_level
WHERE `status` = 1 AND levelid > u.user_level
AND (upgrade_score < u.empirical OR upgrade_total_money < u.total_consumption_money)
ORDER BY levelid DESC
LIMIT 1
);
这个SQL乍一看没什么问题,执行的时候也成功了,可再次执行就修改出错,原因是根据当前的条件无法检索出数据,返回数据为空,注意是数据为空,没有这条数据,而不是有这条数据存在该字段为空,经过排查,修改SQL如下:
UPDATE
lb_user u
SET u.user_level = IFNULL((
SELECT
levelid
FROM lb_user_level
WHERE `status` = 1 AND levelid > u.user_level
AND (upgrade_score < u.empirical OR upgrade_total_money < u.total_consumption_money)
ORDER BY levelid DESC
LIMIT 1
), u.user_level);
经过修改后执行就成功了,并且不存在IFNULL失效的情况;
总结原因是因为:MYSQL中IFNULL仅可以判断该数据存在的情况下为NULL,而不能判断该条数据没有查询到而为NULL的情况。