回答編集履歴

3

ついき

2017/11/10 06:23

投稿

yambejp
yambejp

スコア114843

test CHANGED
@@ -117,3 +117,79 @@
117
117
  これをループさせて羅列する処理をprocedureで書くわけです
118
118
 
119
119
  興味があるようならprocedureの書き方も例示します
120
+
121
+
122
+
123
+ # procedure
124
+
125
+ 横方向への羅列するprocedure
126
+
127
+
128
+
129
+ ```SQL
130
+
131
+ drop procedure if exists proc_yoko_hyoji;
132
+
133
+ delimiter //
134
+
135
+ create procedure proc_yoko_hyoji()
136
+
137
+ begin
138
+
139
+ declare cnt int;
140
+
141
+ declare len int;
142
+
143
+ select count(*) into len from tbl group by mid order by len desc limit 1;
144
+
145
+ set @sql="select mid";
146
+
147
+ set cnt=1;
148
+
149
+ while cnt<=len DO
150
+
151
+ set @sql=concat(@sql
152
+
153
+ ,",group_concat(case rank when ",cnt," then sid end) as sid",cnt
154
+
155
+ ,",group_concat(case rank when ",cnt," then snote end) as snote",cnt
156
+
157
+ );
158
+
159
+ set cnt=cnt+1;
160
+
161
+ end while;
162
+
163
+ set @sql=concat(@sql
164
+
165
+ ," from ( "
166
+
167
+ ,"select mid,sid,snote,(select count(*)+1 from tbl as t2 where t1.mid=t2.mid and t1.sid>t2.sid) as rank "
168
+
169
+ ,"from tbl as t1 "
170
+
171
+ ,") as sub "
172
+
173
+ ,"group by mid "
174
+
175
+ );
176
+
177
+ prepare stmt from @sql;
178
+
179
+ execute stmt;
180
+
181
+ end
182
+
183
+ //
184
+
185
+ delimiter ;
186
+
187
+ ```
188
+
189
+ ※上記を一度つくっておけばあとは、データ更新などがあっても以下を実行するだけです
190
+
191
+ ```SQL
192
+
193
+ call proc_yoko_hyoji;
194
+
195
+ ```

2

調整

2017/11/10 06:23

投稿

yambejp
yambejp

スコア114843

test CHANGED
@@ -76,21 +76,21 @@
76
76
 
77
77
  select mid
78
78
 
79
- ,group_concat(case when rank=1 then sid end) as sid1
79
+ ,group_concat(case rank when 1 then sid end) as sid1
80
80
 
81
- ,group_concat(case when rank=1 then snote end) as snote1
81
+ ,group_concat(case rank when 1 then snote end) as snote1
82
82
 
83
- ,group_concat(case when rank=2 then sid end) as sid2
83
+ ,group_concat(case rank when 2 then sid end) as sid2
84
84
 
85
- ,group_concat(case when rank=2 then snote end) as snote2
85
+ ,group_concat(case rank when 2 then snote end) as snote2
86
86
 
87
- ,group_concat(case when rank=3 then sid end) as sid3
87
+ ,group_concat(case rank when 3 then sid end) as sid3
88
88
 
89
- ,group_concat(case when rank=3 then snote end) as snote3
89
+ ,group_concat(case rank when 3 then snote end) as snote3
90
90
 
91
- ,group_concat(case when rank=4 then sid end) as sid4
91
+ ,group_concat(case rank when 4 then sid end) as sid4
92
92
 
93
- ,group_concat(case when rank=4 then snote end) as snote4
93
+ ,group_concat(case rank when 4 then snote end) as snote4
94
94
 
95
95
  from(
96
96
 
@@ -101,6 +101,8 @@
101
101
  ) as b
102
102
 
103
103
  group by mid
104
+
105
+
104
106
 
105
107
  ```
106
108
 

1

sample

2017/11/10 05:56

投稿

yambejp
yambejp

スコア114843

test CHANGED
@@ -27,3 +27,91 @@
27
27
  ```
28
28
 
29
29
  のようなとり方をするとかで対応してみてください
30
+
31
+
32
+
33
+ # sample
34
+
35
+ SQLでやる簡単なサンプルを付けておきます
36
+
37
+
38
+
39
+ - 元データ
40
+
41
+
42
+
43
+ ```SQL
44
+
45
+ create table tbl(mid int,sid int unique,snote varchar(20));
46
+
47
+ insert into tbl values
48
+
49
+ (1,1,'a'),
50
+
51
+ (1,2,'b'),
52
+
53
+ (1,3,'c'),
54
+
55
+ (1,4,'d'),
56
+
57
+ (2,5,'e'),
58
+
59
+ (2,6,'f'),
60
+
61
+ (2,7,'g'),
62
+
63
+ (3,8,'h'),
64
+
65
+ (4,9,'i'),
66
+
67
+ (4,10,'k');
68
+
69
+ ```
70
+
71
+
72
+
73
+ - 検索
74
+
75
+ ```SQL
76
+
77
+ select mid
78
+
79
+ ,group_concat(case when rank=1 then sid end) as sid1
80
+
81
+ ,group_concat(case when rank=1 then snote end) as snote1
82
+
83
+ ,group_concat(case when rank=2 then sid end) as sid2
84
+
85
+ ,group_concat(case when rank=2 then snote end) as snote2
86
+
87
+ ,group_concat(case when rank=3 then sid end) as sid3
88
+
89
+ ,group_concat(case when rank=3 then snote end) as snote3
90
+
91
+ ,group_concat(case when rank=4 then sid end) as sid4
92
+
93
+ ,group_concat(case when rank=4 then snote end) as snote4
94
+
95
+ from(
96
+
97
+ select mid,sid,snote,(select count(*)+1 from tbl as t2 where t1.mid=t2.mid and t1.sid>t2.sid) as rank
98
+
99
+ from tbl t1
100
+
101
+ ) as b
102
+
103
+ group by mid
104
+
105
+ ```
106
+
107
+
108
+
109
+ 上記元データはmid=1のデータが4つあると目視できるため4列書いていますが
110
+
111
+ 実際にはいくつあるかは状況によって違うでしょう
112
+
113
+ 原則としてgroup_concatの部分は手書きでしかSQLは指定できないので、
114
+
115
+ これをループさせて羅列する処理をprocedureで書くわけです
116
+
117
+ 興味があるようならprocedureの書き方も例示します