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

回答編集履歴

3

ついき

2017/11/10 06:23

投稿

yambejp
yambejp

スコア118024

answer CHANGED
@@ -57,4 +57,42 @@
57
57
  実際にはいくつあるかは状況によって違うでしょう
58
58
  原則としてgroup_concatの部分は手書きでしかSQLは指定できないので、
59
59
  これをループさせて羅列する処理をprocedureで書くわけです
60
- 興味があるようならprocedureの書き方も例示します
60
+ 興味があるようならprocedureの書き方も例示します
61
+
62
+ # procedure
63
+ 横方向への羅列するprocedure
64
+
65
+ ```SQL
66
+ drop procedure if exists proc_yoko_hyoji;
67
+ delimiter //
68
+ create procedure proc_yoko_hyoji()
69
+ begin
70
+ declare cnt int;
71
+ declare len int;
72
+ select count(*) into len from tbl group by mid order by len desc limit 1;
73
+ set @sql="select mid";
74
+ set cnt=1;
75
+ while cnt<=len DO
76
+ set @sql=concat(@sql
77
+ ,",group_concat(case rank when ",cnt," then sid end) as sid",cnt
78
+ ,",group_concat(case rank when ",cnt," then snote end) as snote",cnt
79
+ );
80
+ set cnt=cnt+1;
81
+ end while;
82
+ set @sql=concat(@sql
83
+ ," from ( "
84
+ ,"select mid,sid,snote,(select count(*)+1 from tbl as t2 where t1.mid=t2.mid and t1.sid>t2.sid) as rank "
85
+ ,"from tbl as t1 "
86
+ ,") as sub "
87
+ ,"group by mid "
88
+ );
89
+ prepare stmt from @sql;
90
+ execute stmt;
91
+ end
92
+ //
93
+ delimiter ;
94
+ ```
95
+ ※上記を一度つくっておけばあとは、データ更新などがあっても以下を実行するだけです
96
+ ```SQL
97
+ call proc_yoko_hyoji;
98
+ ```

2

調整

2017/11/10 06:23

投稿

yambejp
yambejp

スコア118024

answer CHANGED
@@ -37,19 +37,20 @@
37
37
  - 検索
38
38
  ```SQL
39
39
  select mid
40
- ,group_concat(case when rank=1 then sid end) as sid1
40
+ ,group_concat(case rank when 1 then sid end) as sid1
41
- ,group_concat(case when rank=1 then snote end) as snote1
41
+ ,group_concat(case rank when 1 then snote end) as snote1
42
- ,group_concat(case when rank=2 then sid end) as sid2
42
+ ,group_concat(case rank when 2 then sid end) as sid2
43
- ,group_concat(case when rank=2 then snote end) as snote2
43
+ ,group_concat(case rank when 2 then snote end) as snote2
44
- ,group_concat(case when rank=3 then sid end) as sid3
44
+ ,group_concat(case rank when 3 then sid end) as sid3
45
- ,group_concat(case when rank=3 then snote end) as snote3
45
+ ,group_concat(case rank when 3 then snote end) as snote3
46
- ,group_concat(case when rank=4 then sid end) as sid4
46
+ ,group_concat(case rank when 4 then sid end) as sid4
47
- ,group_concat(case when rank=4 then snote end) as snote4
47
+ ,group_concat(case rank when 4 then snote end) as snote4
48
48
  from(
49
49
  select mid,sid,snote,(select count(*)+1 from tbl as t2 where t1.mid=t2.mid and t1.sid>t2.sid) as rank
50
50
  from tbl t1
51
51
  ) as b
52
52
  group by mid
53
+
53
54
  ```
54
55
 
55
56
  上記元データはmid=1のデータが4つあると目視できるため4列書いていますが

1

sample

2017/11/10 05:56

投稿

yambejp
yambejp

スコア118024

answer CHANGED
@@ -12,4 +12,48 @@
12
12
  $rows[$row["MAIN_ID"]][]=[$row["SUB_ID","SUB_NOTE"]];
13
13
  }
14
14
  ```
15
- のようなとり方をするとかで対応してみてください
15
+ のようなとり方をするとかで対応してみてください
16
+
17
+ # sample
18
+ SQLでやる簡単なサンプルを付けておきます
19
+
20
+ - 元データ
21
+
22
+ ```SQL
23
+ create table tbl(mid int,sid int unique,snote varchar(20));
24
+ insert into tbl values
25
+ (1,1,'a'),
26
+ (1,2,'b'),
27
+ (1,3,'c'),
28
+ (1,4,'d'),
29
+ (2,5,'e'),
30
+ (2,6,'f'),
31
+ (2,7,'g'),
32
+ (3,8,'h'),
33
+ (4,9,'i'),
34
+ (4,10,'k');
35
+ ```
36
+
37
+ - 検索
38
+ ```SQL
39
+ select mid
40
+ ,group_concat(case when rank=1 then sid end) as sid1
41
+ ,group_concat(case when rank=1 then snote end) as snote1
42
+ ,group_concat(case when rank=2 then sid end) as sid2
43
+ ,group_concat(case when rank=2 then snote end) as snote2
44
+ ,group_concat(case when rank=3 then sid end) as sid3
45
+ ,group_concat(case when rank=3 then snote end) as snote3
46
+ ,group_concat(case when rank=4 then sid end) as sid4
47
+ ,group_concat(case when rank=4 then snote end) as snote4
48
+ from(
49
+ select mid,sid,snote,(select count(*)+1 from tbl as t2 where t1.mid=t2.mid and t1.sid>t2.sid) as rank
50
+ from tbl t1
51
+ ) as b
52
+ group by mid
53
+ ```
54
+
55
+ 上記元データはmid=1のデータが4つあると目視できるため4列書いていますが
56
+ 実際にはいくつあるかは状況によって違うでしょう
57
+ 原則としてgroup_concatの部分は手書きでしかSQLは指定できないので、
58
+ これをループさせて羅列する処理をprocedureで書くわけです
59
+ 興味があるようならprocedureの書き方も例示します