从mysql表更新最大值

时间:2018-04-03 09:17:35

标签: mysql sql sql-update

我正在尝试使用子查询中的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获得最高的查询。

2 个答案:

答案 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子句可以始终为真