根据同一个表中的数据更新多行的单个列。
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 - 每个派生表必须有自己的别名”。
我无法使用别名,因为我从查询中获取两列。任何帮助都会很棒。
答案 0 :(得分:3)
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
答案 1 :(得分:1)
在我看来,你根本不需要做任何次要或加入。这应该做你想要的:
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
的任何行,您的子查询将返回新的id2 = '2' AND status = '0'
和要更新的行的ID号。然后,您将更新所有这些行(符合上述条件),并将status
设置为新的time_val
。
不是先选择它们,而是剪掉中间人,然后用新值更新符合该条件的所有行。您的查询将更快,更直接。
答案 2 :(得分:1)
除了简化版本(由@ Travesty3提供)之外,您似乎正在使用一大堆日期和时间函数来测试一个简单的事情:
UPDATE table1
SET status = '4'
WHERE id2 = '2'
AND status = '0'
AND time_val < NOW() - INTERVAL 120 HOUR
答案 3 :(得分:0)
我们可以通过同一个表或两个不同的表以这种方式更新多行表,只需从我的程序中发布一段 mysql 代码