在mysql中更新同一个表中的多个行

时间:2012-03-14 12:31:03

标签: 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 - 每个派生表必须有自己的别名”。

    
  

我无法使用别名,因为我从查询中获取两列。任何帮助都会很棒。

4 个答案:

答案 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 代码

将文档列更新为 tb1,将文档列更新为 tb2 设置 tb1.documentColumnPos = tb2.documentColumnPos 其中 tb1.userID = user_id 和 tb2.userID 为 NULL 并且 tb1.columnNameDefID= tb2.columnNameDefID 和 tb1 = tab_type 和 tb2.tabtype = tab_type;
,