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

回答編集履歴

6

レイアウト修正

2016/08/08 23:45

投稿

Panzer_vor
Panzer_vor

スコア1636

answer CHANGED
@@ -15,7 +15,9 @@
15
15
  その数値を基にアルファベットを取り出すで良いような気はします。
16
16
 
17
17
 
18
+ **※以下履歴のために残してますが、今回の要望にはかなっていないため無視して下さい**
18
19
 
20
+
19
21
  アルファベット置き換え用テーブルを追加して・・・
20
22
  ```SQL
21
23
  CREATE TABLE LETTERS(

5

コード思いつかず……

2016/08/08 23:45

投稿

Panzer_vor
Panzer_vor

スコア1636

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

4

追記(検討中)

2016/08/08 23:42

投稿

Panzer_vor
Panzer_vor

スコア1636

answer CHANGED
@@ -1,10 +1,7 @@
1
- 前回の質問で当方が答した方法で要件を満せそうですが、
1
+ よく質問文を読むと前要件が異なっていですね^^;
2
- MySQL用に直す必要があるのでしばしお待ちを…
2
+ **以下クエリは更新仕様誤りなの再考てみます。**
3
3
 
4
4
 
5
- **以下前回の回答をベースにクエリだけ差し替えてみました**
6
-
7
-
8
5
  アルファベット置き換え用テーブルを追加して・・・
9
6
  ```SQL
10
7
  CREATE TABLE LETTERS(

3

レイアウト変更

2016/08/08 13:07

投稿

Panzer_vor
Panzer_vor

スコア1636

answer CHANGED
@@ -2,6 +2,9 @@
2
2
  MySQL用に直す必要があるのでしばしお待ちを…
3
3
 
4
4
 
5
+ **以下前回の回答をベースにクエリだけ差し替えてみました**
6
+
7
+
5
8
  アルファベット置き換え用テーブルを追加して・・・
6
9
  ```SQL
7
10
  CREATE TABLE LETTERS(

2

コード追加

2016/08/08 11:00

投稿

Panzer_vor
Panzer_vor

スコア1636

answer CHANGED
@@ -1,2 +1,58 @@
1
1
  前回の質問で当方が回答した方法で要件を満たせそうですが、
2
- MySQL用に直す必要があるのでしばしお待ちを…
2
+ MySQL用に直す必要があるのでしばしお待ちを…
3
+
4
+
5
+ アルファベット置き換え用テーブルを追加して・・・
6
+ ```SQL
7
+ CREATE TABLE LETTERS(
8
+ SEQNO INTEGER(3) -- 連番
9
+ , LETTER VARCHAR(1) -- アルファベット
10
+ )
11
+ ```
12
+ 連番には0~25にa~zを設定し、
13
+ SEQNO LETTER
14
+ 0 a
15
+ 1 b
16
+ ** -- 中略 -- **
17
+ 25 z
18
+
19
+ 以下の感じのクエリでどうでしょうか?
20
+ ただ現在、MySQLでの検証環境がないのでエラーが出るかもしれないです…
21
+ ```SQL
22
+ SET @row = -1;
23
+ UPDATE table,
24
+ (
25
+ SELECT
26
+ T2.*
27
+ , @row:=@row + 1 AS ROW_NUM
28
+ FROM
29
+ (
30
+ SELECT
31
+ T1.MIN_ID
32
+ , T1.UPD_KEY
33
+ FROM
34
+ (
35
+ SELECT
36
+ MIN(ID1) AS MIN_ID
37
+ , ID2 AS UPD_KEY
38
+ FROM
39
+ table
40
+ GROUP BY
41
+ ID2
42
+ ) T1
43
+ ORDER BY T1.MIN_ID
44
+ ) T2
45
+ ) T3
46
+ INNER JOIN LETTERS T4
47
+ ON MOD(T3.ROW_NUM, 25) = T4.SEQNO
48
+ SET
49
+ ID1 = CONCAT(SUBSTR(ID1, 1, 1), T4.LETTER, SUBSTR(ID1, 3))
50
+ WHERE
51
+ ID2 = T4.UPD_KEY
52
+ ```
53
+
54
+
55
+
56
+ **・追記**
57
+ MOD(T1.ROW_NUM, 25)と文字列変換テーブルの連番で結合かけてるので、
58
+ zまで採番が終わるとaから循環し直す仕様にしてます。

1

内容変更

2016/08/08 10:58

投稿

Panzer_vor
Panzer_vor

スコア1636

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