回答編集履歴

6

レイアウト修正

2016/08/08 23:45

投稿

Panzer_vor
Panzer_vor

スコア1636

test CHANGED
@@ -29,6 +29,10 @@
29
29
  その数値を基にアルファベットを取り出すで良いような気はします。
30
30
 
31
31
 
32
+
33
+
34
+
35
+ **※以下履歴のために残してますが、今回の要望にはかなっていないため無視して下さい**
32
36
 
33
37
 
34
38
 

5

コード思いつかず……

2016/08/08 23:45

投稿

Panzer_vor
Panzer_vor

スコア1636

test CHANGED
@@ -1,6 +1,34 @@
1
1
  よく質問文を読むと前回と要件が異なっていたのですね^^;
2
2
 
3
- **以下のクエリは更新仕様誤りなので再考してみます。**
3
+ **あれから再考してみましたが、
4
+
5
+ 他の回答者さんの回答以外で、これだというクエリが力及ばず思いつきませんでした。**
6
+
7
+
8
+
9
+ ただサンプルにあげてるデータだけを見ると、
10
+
11
+ 0. IDが切り変わるタイミングで採番をリセットする
12
+
13
+ 0. さらに言うとID毎に枝番が振られる
14
+
15
+
16
+
17
+ 上記ルールが成り立ってるように見えるので、
18
+
19
+ - 登録された枝番が必ず1から始まる
20
+
21
+ - 枝番には欠番が存在しない
22
+
23
+
24
+
25
+ が保証されているのであれば難しく考えず、
26
+
27
+ 単純に**枝番を数値にキャスト**して、
28
+
29
+ その数値を基にアルファベットを取り出すで良いような気はします。
30
+
31
+
4
32
 
5
33
 
6
34
 

4

追記(検討中)

2016/08/08 23:42

投稿

Panzer_vor
Panzer_vor

スコア1636

test CHANGED
@@ -1,12 +1,6 @@
1
- 前回の質問で当方が答した方法で要件を満せそうですが、
1
+ よく質問文を読むと前要件が異なっていですね^^;
2
2
 
3
- MySQL用に直す必要があるのでしばしお待ちを…
4
-
5
-
6
-
7
-
8
-
9
- **以下前回回答をベースにクエリだけ差替えてみました**
3
+ **以下のクエリは更新仕様誤りなので再考してみます。**
10
4
 
11
5
 
12
6
 

3

レイアウト変更

2016/08/08 13:07

投稿

Panzer_vor
Panzer_vor

スコア1636

test CHANGED
@@ -1,6 +1,12 @@
1
1
  前回の質問で当方が回答した方法で要件を満たせそうですが、
2
2
 
3
3
  MySQL用に直す必要があるのでしばしお待ちを…
4
+
5
+
6
+
7
+
8
+
9
+ **以下前回の回答をベースにクエリだけ差し替えてみました**
4
10
 
5
11
 
6
12
 

2

コード追加

2016/08/08 11:00

投稿

Panzer_vor
Panzer_vor

スコア1636

test CHANGED
@@ -1,3 +1,115 @@
1
1
  前回の質問で当方が回答した方法で要件を満たせそうですが、
2
2
 
3
3
  MySQL用に直す必要があるのでしばしお待ちを…
4
+
5
+
6
+
7
+
8
+
9
+ アルファベット置き換え用テーブルを追加して・・・
10
+
11
+ ```SQL
12
+
13
+ CREATE TABLE LETTERS(
14
+
15
+ SEQNO INTEGER(3) -- 連番
16
+
17
+ , LETTER VARCHAR(1) -- アルファベット
18
+
19
+ )
20
+
21
+ ```
22
+
23
+ 連番には0~25にa~zを設定し、
24
+
25
+ SEQNO LETTER
26
+
27
+ 0 a
28
+
29
+ 1 b
30
+
31
+ ** -- 中略 -- **
32
+
33
+ 25 z
34
+
35
+
36
+
37
+ 以下の感じのクエリでどうでしょうか?
38
+
39
+ ただ現在、MySQLでの検証環境がないのでエラーが出るかもしれないです…
40
+
41
+ ```SQL
42
+
43
+ SET @row = -1;
44
+
45
+ UPDATE table,
46
+
47
+ (
48
+
49
+ SELECT
50
+
51
+ T2.*
52
+
53
+ , @row:=@row + 1 AS ROW_NUM
54
+
55
+ FROM
56
+
57
+ (
58
+
59
+ SELECT
60
+
61
+ T1.MIN_ID
62
+
63
+ , T1.UPD_KEY
64
+
65
+ FROM
66
+
67
+ (
68
+
69
+ SELECT
70
+
71
+ MIN(ID1) AS MIN_ID
72
+
73
+ , ID2 AS UPD_KEY
74
+
75
+ FROM
76
+
77
+ table
78
+
79
+ GROUP BY
80
+
81
+ ID2
82
+
83
+ ) T1
84
+
85
+ ORDER BY T1.MIN_ID
86
+
87
+ ) T2
88
+
89
+ ) T3
90
+
91
+ INNER JOIN LETTERS T4
92
+
93
+ ON MOD(T3.ROW_NUM, 25) = T4.SEQNO
94
+
95
+ SET
96
+
97
+ ID1 = CONCAT(SUBSTR(ID1, 1, 1), T4.LETTER, SUBSTR(ID1, 3))
98
+
99
+ WHERE
100
+
101
+ ID2 = T4.UPD_KEY
102
+
103
+ ```
104
+
105
+
106
+
107
+
108
+
109
+
110
+
111
+ **・追記**
112
+
113
+ MOD(T1.ROW_NUM, 25)と文字列変換テーブルの連番で結合かけてるので、
114
+
115
+ zまで採番が終わるとaから循環し直す仕様にしてます。

1

内容変更

2016/08/08 10:58

投稿

Panzer_vor
Panzer_vor

スコア1636

test CHANGED
@@ -1,5 +1,3 @@
1
- > kutsulogさん
1
+ 前回の質問で当方が回答した方法で要件を満たせそうですが、
2
2
 
3
- UPDATEでのFROM句はPostgreSQLのベンダ拡張だったように思います。
4
-
5
- MySQLだと恐らくSET句の前の部分でサブクエリを記述必要がありそうす。
3
+ MySQL用に直す必要があるのしばしお待ちを…