2012-03-14 73 views
0

根據來自同一個表的數據更新多個行上的單個列。更新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 - 每一個派生表必須有它自己的別名」。

,因爲我從查詢中獲取兩列,我不能用別名。任何幫助都會很棒。

+0

而問題出在哪裏?你卡在哪裏? – Lion 2012-03-14 12:32:43

+0

你可以使用別名,比如'SELECT q1.newTime,q1.new_id FROM(SELECT newTime,new_id FROM ...)q1'。在這種情況下,'q1'是派生表的別名。但是,就你而言,它看起來不需要subquerying和/或join。請參閱下面的答案。 – Travesty3 2012-03-14 13:16:44

回答

3

UPDATE語句在MySQL語法中沒有FROM子句。但是,您可以針對子查詢JOINtable

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 
+0

+1尼斯解決方案...連接是理想的相同的表更新和選擇 – 2012-08-10 01:03:34

1

它在我看來,你不需要做任何subquerying或加入。這應該做你想要什麼:

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及ID的行數更新,對符合條件id2 = '2' AND status = '0'任何行。然後,您將更新所有這些行(符合上述條件)並將status設置爲新的time_val

不是先選擇它們,而是剪掉中間的人,只是用新值更新符合該條件的所有行。您的查詢將更快,更直接。

+0

好的。我沒有注意到這一點。衛生署! – nnichols 2012-03-14 13:09:37

1

除了簡化版本(由@ Travesty3提供),看來你使用的是一大堆的日期和時間函數來測試一個簡單的事情:

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