Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/63.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在mysql中更新同一表中的多行_Mysql - Fatal编程技术网

在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很好的解决方案…联接是适用于相同的表更新和选择