teratail header banner
teratail header banner
質問するログイン新規登録

回答編集履歴

7

変更

2016/08/22 04:09

投稿

A.Ichi
A.Ichi

スコア4070

answer CHANGED
@@ -41,4 +41,4 @@
41
41
  mid(ID1,3,4)), ID2=(@col:=ID2);
42
42
  ```
43
43
 
44
- 最後のはMysqlの関数を評価する順番が保障されていないとのご指摘を受けましたので、無効としてください。concatにおけるパラメの評価の順番は保障されていない為、最後の部分が先に行われる事が有ると言う事です。ご指摘有難うございます。
44
+ 最後のはMysqlの関数を評価する順番が保障されていないとのご指摘を受けましたので、無効としてください。1ステトメント中変数評価の順番は基本的には保障されていない為、最後の部分が先に行われる事が有り得ると言う事です。ご指摘有難うございます。

6

訂正します

2016/08/22 04:09

投稿

A.Ichi
A.Ichi

スコア4070

answer CHANGED
@@ -31,7 +31,7 @@
31
31
  ご指摘を反映しようと、せめてID2の順番でabc...になる様にしましたが、後ろでS001が現れると困る。
32
32
 
33
33
 
34
- こんな事もMySQLは出来るんですね!
34
+ こんな事もMySQLは出来るんですね!(改定=>無保証)
35
35
  ```sql4
36
36
  SET @row=0;
37
37
  SET @col=null;
@@ -39,4 +39,6 @@
39
39
  SET ID1=concat(mid(ID1,1,1),
40
40
  mid('abcdefghijklmnopqrstuvwxyz',if(@col=ID2,@row,(@row:=@row+1)),1),
41
41
  mid(ID1,3,4)), ID2=(@col:=ID2);
42
- ```
42
+ ```
43
+
44
+ 最後のはMysqlの関数を評価する順番が保障されていないとのご指摘を受けましたので、無効としてください。concatにおけるパラメータの評価の順番は保障されていない為、最後の部分が先に行われる事が有ると言う事です。ご指摘有難うございます。

5

追加

2016/08/22 03:47

投稿

A.Ichi
A.Ichi

スコア4070

answer CHANGED
@@ -28,4 +28,15 @@
28
28
  where t1.ID2=t2.ID2;
29
29
  ```
30
30
 
31
- ご指摘を反映しようと、せめてID2の順番でabc...になる様にしましたが、後ろでS001が現れると困る。
31
+ ご指摘を反映しようと、せめてID2の順番でabc...になる様にしましたが、後ろでS001が現れると困る。
32
+
33
+
34
+ こんな事もMySQLは出来るんですね!
35
+ ```sql4
36
+ SET @row=0;
37
+ SET @col=null;
38
+ UPDATE tableX
39
+ SET ID1=concat(mid(ID1,1,1),
40
+ mid('abcdefghijklmnopqrstuvwxyz',if(@col=ID2,@row,(@row:=@row+1)),1),
41
+ mid(ID1,3,4)), ID2=(@col:=ID2);
42
+ ```

4

変更

2016/08/04 23:22

投稿

A.Ichi
A.Ichi

スコア4070

answer CHANGED
@@ -28,4 +28,4 @@
28
28
  where t1.ID2=t2.ID2;
29
29
  ```
30
30
 
31
- ご指摘を反映しようと、せめてID2の順番でabc...になる様にしましたが、後ろでS0001が現れると困る。
31
+ ご指摘を反映しようと、せめてID2の順番でabc...になる様にしましたが、後ろでS001が現れると困る。

3

指摘に対応

2016/08/04 11:28

投稿

A.Ichi
A.Ichi

スコア4070

answer CHANGED
@@ -13,7 +13,7 @@
13
13
  update table t1,
14
14
  (select @i:=@i+1 as row,
15
15
  substr('abcdefghijklmnopqrstuvwxyz',@i,1) as ID1,
16
- ID2 from (select @i:=0) as dum,(select distinct ID2 from table) t3) t2
16
+ ID2 from (select @i:=0) as dum,(select distinct ID2 from table order by 1) t3) t2
17
17
  set t1.ID1=concat(mid(t1.ID1,1,1),t2.ID1,mid(t1.ID1,3,4))
18
18
  where t1.ID2=t2.ID2;
19
19
  ```
@@ -23,7 +23,9 @@
23
23
  update table t1,
24
24
  (select
25
25
  substr('abcdefghijklmnopqrstuvwxyz',@i:=@i+1,1) as ID1,
26
- ID2 from (select @i:=0) as dum,(select distinct ID2 from table) t3) t2
26
+ ID2 from (select @i:=0) as dum,(select distinct ID2 from table order by 1) t3) t2
27
27
  set t1.ID1=concat(mid(t1.ID1,1,1),t2.ID1,mid(t1.ID1,3,4))
28
28
  where t1.ID2=t2.ID2;
29
- ```
29
+ ```
30
+
31
+ ご指摘を反映しようと、せめてID2の順番でabc...になる様にしましたが、後ろでS0001が現れると困る。

2

追加

2016/08/04 11:27

投稿

A.Ichi
A.Ichi

スコア4070

answer CHANGED
@@ -16,4 +16,14 @@
16
16
  ID2 from (select @i:=0) as dum,(select distinct ID2 from table) t3) t2
17
17
  set t1.ID1=concat(mid(t1.ID1,1,1),t2.ID1,mid(t1.ID1,3,4))
18
18
  where t1.ID2=t2.ID2;
19
+ ```
20
+
21
+ 改良版(結果は一緒)
22
+ ```sql3
23
+ update table t1,
24
+ (select
25
+ substr('abcdefghijklmnopqrstuvwxyz',@i:=@i+1,1) as ID1,
26
+ ID2 from (select @i:=0) as dum,(select distinct ID2 from table) t3) t2
27
+ set t1.ID1=concat(mid(t1.ID1,1,1),t2.ID1,mid(t1.ID1,3,4))
28
+ where t1.ID2=t2.ID2;
19
29
  ```

1

訂正

2016/08/04 11:19

投稿

A.Ichi
A.Ichi

スコア4070

answer CHANGED
@@ -6,4 +6,14 @@
6
6
  concat(mid(ID1,1,1),substr('abcdefghijklmnopqrstuvwxyz',@i,1),mid(ID1,3,4)) as ID1,
7
7
  ID2 from (select @i:=0) as dum,(select distinct ID1, ID2 from table) t3) t2
8
8
  set t1.ID1=t2.ID1 where t1.ID2=t2.ID2;
9
+ ```
10
+
11
+ 間違えておりました訂正(一応動く)
12
+ ```sql2
13
+ update table t1,
14
+ (select @i:=@i+1 as row,
15
+ substr('abcdefghijklmnopqrstuvwxyz',@i,1) as ID1,
16
+ ID2 from (select @i:=0) as dum,(select distinct ID2 from table) t3) t2
17
+ set t1.ID1=concat(mid(t1.ID1,1,1),t2.ID1,mid(t1.ID1,3,4))
18
+ where t1.ID2=t2.ID2;
9
19
  ```