2012-03-14 35 views
0

同じテーブルのデータに応じて、複数の行にわたって1つの列を更新します。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 

これは私のクエリです。前もって感謝します。

編集:

これは、これを達成するための代替クエリです。しかし、それはまた、私にエラー

" - すべての派生テーブルは、独自の別名を持っている必要があります。#1248"

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 
を与えます。私は、クエリからの2つの列をフェッチしていますよう

私は、エイリアスを使用することはできません。どんな助けも素晴らしいだろう。

+0

、どこに問題がありますか?どこで立ち往生しましたか? – Lion

+0

エイリアスは 'SELECT q1.newTime、q1.new_id FROM(SELECT newTime、new_id FROM ...)q1'のようにするだけで使用できます。その場合、 'q1'は派生テーブルのエイリアスです。しかし、あなたのケースでは、サブクエリのように見えます。そして/または結合は不要です。下の私の答えを見てください。 – Travesty3

答えて

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すてきな解決策...ジョインは同じテーブルの更新と選択に理想的です –

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' 

をあなたが書いたクエリでは、あなたのサブクエリは、基準id2 = '2' AND status = '0'に一致するすべての行に対して、更新する行の新しいtime_val ID番号とを取り戻すだろう。上記の条件に一致するすべての行を更新し、statusを新しいtime_valに設定します。

最初にそれらを選択するのではなく、中間の人を切り抜いて、その基準に一致するすべての行を新しい値で更新するだけです。あなたの質問はより速く、より簡単になります。

+0

いいです。私はそれに気付かなかった。ドー! – nnichols

1

(@ Travesty3提供)簡易版のほかに、あなたが単純なことをテストするために、日付と時刻関数の全体の束を使用しているようだ:

UPDATE table1 
SET status = '4' 
WHERE id2 = '2' 
    AND status = '0' 
    AND time_val < NOW() - INTERVAL 120 HOUR 
関連する問題