2017-04-26 14 views
0

によって特定の日付に基づいてすべての行を更新する方法:私はMySQLのテーブル次ている単一のMySQLのクエリ

私は日が同じ vidための最も早い場合ような方法で num列を更新する必要が
============================= 
id | vid | date | num | 
============================= 
1 | 1 | 2017-01-01 |  | 
2 | 1 | 2017-02-20 |  | 
3 | 2 | 2017-02-25 |  | 
4 | 1 | 2017-03-05 |  | 
============================= 

、その後、num個の列は、それ以外の場合は、だから、2になります、1になり、データベース/テーブルを更新した後、テーブルは次のようになります。2017-01-01よう

============================= 
id | vid | date | num | 
============================= 
1 | 1 | 2017-01-01 | 1 | 
2 | 1 | 2017-02-20 | 2 | 
3 | 2 | 2017-02-25 | 1 | 
4 | 1 | 2017-03-05 | 2 | 
============================= 

vid=1ための最も早い日付ですので、numは012です。したがって、vid=1の他の行はすべて2です。一方、vid=2の場合、num列はvid=2の唯一の行であるため1になります。

どのようにして上記のロジックに基づいて自動的にテーブル全体を自動的に更新するように、単一のmysqlクエリを作成できますか?あなたのテーブルを想定し

答えて

1

は 'yourTable' です:

UPDATE 
    yourTable inner join (select *,IF(date=(select min(date) 
        from yourTable 
        where vid=a.vid 
        group by vid), 1, 2) as actualNum 
       from yourTable a) abc 
    ON yourTable.id = abc.id 
SET yourTable.num = abc.actualNum; 
-1
update mytable as m 
set num = case when date = 
(select min(date) from mytable m2 where m2.id = m.id) 
then 1 else 2 end 

...私は考える

または多分

UPDATE m 
set num = case when date = 
    (select min(date) from mytable m2 where m2.id = m.id) 
    then 1 else 2 end 
FROM mytable m 
+0

あなたが渡すことができないとして、このソリューションが動作しません。サブクエリの中で同じテーブルを更新している間 –

関連する問題