[英]Update multiple rows from same table in mysql
根据同一表中的数据更新多行上的单个列。
update table1 set status=newtime
from (
select
case
when TIME_FORMAT( TIMEDIFF( ADDTIME( time_val, '120:00:00' ), NOW() ), '%Hh %im %ss')<0 then '4'
else '0'
end as newtime,
id as new_id
FROM table1
where id2='2'
and status='0'
)
where id=new_id
这是我的查询。 提前致谢。
编辑:
这是实现此目的的替代查询。 但它也给了我一个错误
update table1 set status=
(select
case when timeleft<0 then '4' else '0' end as something,
new_id
from
(
select
TIME_FORMAT( TIMEDIFF( ADDTIME( time_val, '120:00:00' ), NOW() ), '%Hh %im %ss') as newtime,
id as new_id
FROM
table1
where id2='2' and
status='0'
)
}
where id=new_id
“#1248 - 每个派生表都必须有自己的别名”。
我无法使用别名,因为我正在从查询中获取两列。 任何帮助都会很棒。
UPDATE
语句在 MySQL 语法中没有FROM
子句。 但是,您可以针对子查询JOIN
table
。
UPDATE
table1 t1
JOIN (
select
case
when TIME_FORMAT( TIMEDIFF( ADDTIME( time_val, '120:00:00' ), NOW() ), '%Hh %im %ss')<0 then '4'
else '0'
end as newtime,
id as new_id
FROM table1
WHERE id2='2' AND status='0'
) tsub ON t1.id = tsub.new_id
SET status = tsub.newtime
在我看来,您根本不需要进行任何子查询或加入。 这应该做你想做的:
UPDATE table1
SET status = CASE WHEN TIME_FORMAT(TIMEDIFF(ADDTIME(time_val, '120:00:00'), NOW()), '%Hh %im %ss') < 0 THEN '4' ELSE '0' END
WHERE id2 = '2' AND status = '0'
在您编写的查询中,您的子查询将返回新的time_val
和要更新的行的 id 号,对于任何符合条件id2 = '2' AND status = '0'
。 然后,您将更新所有这些行(符合上述条件的行)并将status
设置为新的time_val
。
与其先选择它们,不如去掉中间人,然后用新值更新与该条件匹配的所有行。 您的查询将更快、更直接。
除了简化版本(由@Travesty3 提供)之外,您似乎正在使用一大堆日期和时间函数来测试一个简单的事情:
UPDATE table1
SET status = '4'
WHERE id2 = '2'
AND status = '0'
AND time_val < NOW() - INTERVAL 120 HOUR
我们可以通过同一个表或两个不同的表以这种方式更新多行表,只需从我的程序中发布一段 mysql 代码
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.