我正在尝试使用子查询中的max(col)
更新表的值,但出于某种原因,它正在更新与我正在使用的user_id
列匹配的所有值。
这是我的表结构:
user_id | steps | in_date
--------+-------+-----------
8 |10 | 1522246892
8 |10 | 1522250713
7 |10 | 1522250799
这是我的疑问:
UPDATE userdata
SET steps = (steps + 20)
WHERE user_id = 8
AND in_date = (SELECT max(in_date) WHERE user_id = 8);
我希望它只更新第二列,但它改为使用user_id
= 8更新两列。为什么它不按预期工作?我做错了什么?
编辑:感谢Manoj的评论,我将查询更改为以下内容,并且有效:
UPDATE userdata
SET steps = (steps + 20)
WHERE user_id = 8
ORDER BY in_date DESC LIMIT 1;
按照他的方式做得更好,因为我不必运行两个查询,并且已经通过id获得最高的查询。
答案 0 :(得分:1)
您将遇到sql错误" 您无法指定目标表' userdata'用于FROM子句中的更新"当您在子查询中使用相同的表来更新同一个表时。
你说它的运行很奇怪,因为, - 你错过了子查询中的子句 - 你不能使用同一张表
请你更具体一点。
答案 1 :(得分:0)
似乎你错过了subselect中的from子句,并且为了避免在select和updated值之间混淆,你可以使用ainner subselect建立一个临时表
UPDATE userdata
SET steps = (steps + 20)
WHERE user_id = 8
AND in_date = ( select max_date from (
SELECT max(in_date) max_date FROM userdata WHERE user_id = 8) t);
以这种方式,AND子句可以始终为真