在mysql中更新同一表中的多行
根据同一表中的数据,在多行上更新单个列在mysql中更新同一表中的多行,mysql,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 a
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
更新表1设置状态=newtime
从(
选择
案例
当TIME_格式(TIMEDIFF(ADDTIME(TIME_val,'120:00:00'),NOW(),'%Hh%im%ss')UPDATE
语句在MySQL语法中没有FROM
子句时。但是,您可以针对子查询连接表
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 t1
加入(
选择
案例
当TIME_格式(TIMEDIFF(ADDTIME(TIME_val,'120:00:00'),NOW(),'%Hh%im%ss')UPDATE
语句在MySQL语法中没有FROM
子句时。但是,您可以针对子查询连接表
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 t1
加入(
选择
案例
当TIME_格式(TIMEDIFF(ADDTIME(TIME_val,'120:00:00'),NOW(),'%Hh%im%ss')在我看来,您根本不需要进行任何子查询或加入。这应该可以满足您的要求:
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'
更新表1
设置状态=时间格式(TIMEDIFF(ADDTIME(TIME_val,'120:00:00'),NOW(),'%Hh%im%ss')小于0时的情况,然后是'4'或'0'结束
其中id2='2'和状态='0'
在您编写的查询中,您的子查询将为符合条件id2='2'和status='0'
的任何行返回新的time\u val
和要更新的行的id号。然后,您将更新所有符合上述条件的行,并将status
设置为新的time\u val
与其先选择它们,不如省去中间人,用新值更新所有符合该条件的行。您的查询将更快、更直接。在我看来,您根本不需要进行任何子查询或联接。这应该可以满足您的需要:
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'
更新表1
设置状态=时间格式(TIMEDIFF(ADDTIME(TIME_val,'120:00:00'),NOW(),'%Hh%im%ss')小于0时的情况,然后是'4'或'0'结束
其中id2='2'和状态='0'
在您编写的查询中,您的子查询将为符合条件id2='2'和status='0'
的任何行返回新的time\u val
和要更新的行的id号。然后,您将更新所有符合上述条件的行,并将status
设置为新的time\u val
与其先选择它们,不如删掉中间人,用新值更新所有符合该条件的行。您的查询将更快、更直接。除了简化版(由@Travesty3提供)之外,您似乎还使用了一大堆日期和时间函数来测试一件简单的事情:
UPDATE table1
SET status = '4'
WHERE id2 = '2'
AND status = '0'
AND time_val < NOW() - INTERVAL 120 HOUR
更新表1
设置状态='4'
其中id2='2'
和状态='0'
和时间值<现在()-间隔120小时
除了简化版(由@Travesty3提供)之外,您似乎还使用了一大堆日期和时间函数来测试一件简单的事情:
UPDATE table1
SET status = '4'
WHERE id2 = '2'
AND status = '0'
AND time_val < NOW() - INTERVAL 120 HOUR
更新表1
设置状态='4'
其中id2='2'
和状态='0'
和时间值<现在()-间隔120小时
问题出在哪里?您在哪里被卡住了?您可以使用别名,只需执行以下操作即可选择q1.newTime,q1.new\u id FROM(选择newTime,new\u id FROM…)q1
。在这种情况下,q1
是派生表的别名。但是,在您的情况下,似乎不需要子查询和/或联接。请参阅下面的答案。问题出在哪里?您在哪里卡住了?您可以通过执行类似于选择q1.newTime,q1.new\u id FROM的操作来使用别名(从中选择新时间、新id…)q1
。在这种情况下,q1
是派生表的别名。但是,在您的情况下,似乎不需要子查询和/或联接。请参阅下面的答案。很好。我没有注意到。Doh!很好。我没有注意到。Doh!+1很好的解决方案…联接非常适合于相同的表更新,并且选择+1很好的解决方案…联接是适用于相同的表更新和选择