2017-10-04 7 views
1

現在の行の列c1が前の行のc1と等しい場合、列c3を前の行の列c2に設定します。それ以外の場合は、c3をNULLに設定します(または何も設定しないでください)。誰かがなぜ次のクエリの結果がc3がすべての行に対してnullであるのかを教えてもらえますか?mysql:別の列の値に基づいて前の行の値に列を設定します

ダミー列は、次の行に使用されるこの行のc1とc2の値を格納する変数@ c1と@ c2を設定できるだけの場所です。ところで、私はc3が最初に更新されると仮定して間違っていますか?すなわち、@ c2が前の値を取得する(@ c2が現在のc2に割り当てられる前に)でしょうか?

UPDATE t SET c3 = IF (c1 = @c1, @c2, NULL), dummy1 = @c1:=c1, dummy2 = @c2:=c2; 

答えて

2

私はこれを試してもうまくいくようです。しかし、特定の順序で行を評価する必要がある場合はORDER BYが必要です。

create table t (c1 int, c2 int, c3 int, id int auto_increment primary key); 

insert into t (c1, c2, c3) values 
(1, 2, 3), 
(1, 4, 5), 
(2, 6, 7); 

select * from t; 
+------+------+------+----+ 
| c1 | c2 | c3 | id | 
+------+------+------+----+ 
| 1 | 2 | 3 | 1 | 
| 1 | 4 | 5 | 2 | 
| 2 | 6 | 7 | 3 | 
+------+------+------+----+ 

update t set c3=if([email protected],@c2,NULL), c1 = @c1:=c1, c2 = @c2:=c2 order by id; 
Query OK, 3 rows affected (0.02 sec) 
Rows matched: 3 Changed: 3 Warnings: 0 

select * from t; 
+------+------+------+----+ 
| c1 | c2 | c3 | id | 
+------+------+------+----+ 
| 1 | 2 | NULL | 1 | 
| 1 | 4 | 2 | 2 | 
| 2 | 6 | NULL | 3 | 
+------+------+------+----+ 

ダミー列は必要ありません。それらはno-opsなので、c1 = c1とc2 = c2を設定するだけです。

+0

はい、私は完全に秩序を忘れていました。 - 「ORDER BY id、c1」が私のために働いていました!ダミー列を必要としないことについての良い点。ありがとう! – Yury

+0

「ORDER BY id」だけでは私のために何もしないのですか? AFAIKでは、どちらの列にもヌルがありません(すでにシャットダウンされていますが、午前中にチェックされます)。 – Yury

+0

各id値には複数の行があるため、同数があり、同じIDを持つ行の順序は予測できません。申し訳ありませんが私は私の答えでそれを忘れました。 –

関連する問題