简体   繁体   中英

Update multiple rows from same table in mysql

Update a single column over multiple rows depending on the data from the same table.

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

This is my query. Thanks in advance.

Edit:

This is an alternate query to achieve this. But it also gives me an error

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 - Every derived table must have its own alias".

I cannot use alias as I am fetching two columns from the query. Any help would be great.

UPDATE statements have no FROM clause in MySQL syntax. However, you can JOIN table against the subquery.

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

It looks to me like you don't need to do any subquerying or joining at all. This should do what you want:

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'

In the query you wrote, your subquery will get back the new time_val and the id number of the row to update, for any rows that match the criteria id2 = '2' AND status = '0' . You will then update all those rows (that matched the above criteria) and set the status to the new time_val .

Instead of selecting them first, cut out the middle man and just update all rows that match that criteria with the new value. Your query will be faster and more straightforward.

Besides the simplified version (provided by @Travesty3), it seems you are using a whole bunch of date and time functions to test for a simple thing:

UPDATE table1 
SET status = '4'
WHERE id2 = '2' 
  AND status = '0'
  AND time_val < NOW() - INTERVAL 120 HOUR 

We can update table with multiple row by same table or two different table in this manner, just posting a snippet of mysql code from my procedure

Update documentcolumns as tb1, documentcolumns as tb2 set tb1.documentColumnPos = tb2.documentColumnPos Where tb1.userID = user_id and tb2.userID is NULL and tb1.columnNameDefID= tb2.columnNameDefID and tb1.tabtype = tab_type and tb2.tabtype = tab_type;
,

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM