回答編集履歴

3

調整

2019/02/18 10:05

投稿

yambejp
yambejp

スコア114885

test CHANGED
@@ -43,3 +43,65 @@
43
43
  6のデータはtype=1だけどorderが1,2,3ではないので対象外
44
44
 
45
45
  7,8のデータはtypeが1じゃないので対象外
46
+
47
+
48
+
49
+ # 追記
50
+
51
+
52
+
53
+ > SQLSTATE[23000]: Integrity constraint violation: 1062 Duplicate entry '1-3' for key ~~~~
54
+
55
+
56
+
57
+ おそらく`type`,`order`に復号ユニーク属性がついていますね。
58
+
59
+ そうであれば条件が競合するので無理です。
60
+
61
+ 無理を前提でやるなら、たとえばorderがつねにプラスだとすれば一度マイナスデータで
62
+
63
+ 登録してあとから絶対値で更新するとかや利用はあります。
64
+
65
+
66
+
67
+ しかし逆にこれはunique属性をわざわざつけて競合しないようにしている設定を
68
+
69
+ 無効にししてしまうので、運用上正しいかどうかはわかりません
70
+
71
+
72
+
73
+ - sample
74
+
75
+ ```SQL
76
+
77
+ create table tbl (id int primary key,`type` int,`order` int,unique key(`type`,`order`));
78
+
79
+ insert into tbl values(1,1,1),(2,1,2),(3,1,3)
80
+
81
+ ```
82
+
83
+ とりあえずupdate
84
+
85
+ ```SQL
86
+
87
+ update tbl set `order`=coalesce(elt(field(`order`,1,2,3),2,3,1),`order`)
88
+
89
+ WHERE type=1
90
+
91
+ ```
92
+
93
+ 当然エラー
94
+
95
+
96
+
97
+ 無理やりやる
98
+
99
+ ```SQL
100
+
101
+ update tbl set `order`=coalesce(elt(field(`order`,1,2,3),-2,-3,-1),`order`)
102
+
103
+ WHERE type=1;
104
+
105
+ update tbl set `order`=abs(`order`);
106
+
107
+ ```

2

一部腸壊死

2019/02/18 10:05

投稿

yambejp
yambejp

スコア114885

test CHANGED
@@ -18,13 +18,23 @@
18
18
 
19
19
  - 更新処理
20
20
 
21
+ ※ごめんなさい、調整しました
22
+
21
23
  ```SQL
22
24
 
23
25
  update tbl set `order`=elt(field(`order`,1,2,3),2,3,1)
24
26
 
25
27
  WHERE `order` IN(1,2,3) and type=1
26
28
 
29
+ ```
27
30
 
31
+ ↓↓↓
32
+
33
+ ```SQL
34
+
35
+ update tbl set `order`=coalesce(elt(field(`order`,1,2,3),2,3,1),`order`)
36
+
37
+ WHERE type=1
28
38
 
29
39
  ```
30
40
 

1

調整

2019/02/18 08:14

投稿

yambejp
yambejp

スコア114885

test CHANGED
@@ -10,7 +10,7 @@
10
10
 
11
11
  create table tbl (id int primary key,`type` int,`order` int);
12
12
 
13
- insert into tbl values(1,1,1),(2,1,2),(3,1,3),(4,1,2),(5,1,2),(6,1,1),(7,2,1),(8,3,2);
13
+ insert into tbl values(1,1,1),(2,1,2),(3,1,3),(4,1,2),(5,1,2),(6,1,4),(7,2,1),(8,3,2);
14
14
 
15
15
  ```
16
16
 
@@ -28,4 +28,8 @@
28
28
 
29
29
  ```
30
30
 
31
- 1-6のデータはtypeが1なので更新される、7,8のデータは対象外
31
+ 1-5のデータはtypeが1なので更新される、
32
+
33
+ 6のデータはtype=1だけどorderが1,2,3ではないので対象外
34
+
35
+ 7,8のデータはtypeが1じゃないので対象外