回答編集履歴

1

追記

2018/03/22 09:49

投稿

yambejp
yambejp

スコア114883

test CHANGED
@@ -49,3 +49,95 @@
49
49
  横方向へIDを自動的に増やしていくのにはプロシージャというもので処理します
50
50
 
51
51
  今回は煩雑にナリそうなので、上記まで理解することをおすすめします
52
+
53
+
54
+
55
+ # プロシージャまで
56
+
57
+ docにfuga4を追記した上でリストを自動でつくります
58
+
59
+ - 元データ
60
+
61
+ ```SQL
62
+
63
+ create table user(uid int unique,uname varchar(30));
64
+
65
+ insert into user values(1,'hoge1'),(2,'hoge2'),(3,'hoge3');
66
+
67
+ create table doc(did int unique,dname varchar(30));
68
+
69
+ insert into doc values(1,'fuga1'),(2,'fuga2'),(3,'fuga3'),(4,'fuga4');
70
+
71
+ create table user_doc(uid int,did int,unique(uid,did));
72
+
73
+ insert into user_doc values(1,1),(1,2),(1,3),(2,1),(2,3),(3,2),(3,3);
74
+
75
+ ```
76
+
77
+ - プロシージャ作成(1回だけ実効する)
78
+
79
+ ```SQL
80
+
81
+ drop procedure if exists myproc;
82
+
83
+ delimiter //
84
+
85
+ create procedure myproc()
86
+
87
+ begin
88
+
89
+ declare a int;
90
+
91
+ declare b varchar(100);
92
+
93
+ declare done int default 0;
94
+
95
+ declare cur cursor for
96
+
97
+ select did,dname from doc order by did;
98
+
99
+ declare continue handler for sqlstate '02000' set done=1;
100
+
101
+ set @sql='select t3.uname,t2.* from (select t1.uid ';
102
+
103
+ open cur;
104
+
105
+ repeat
106
+
107
+ fetch cur into a,b;
108
+
109
+ if not done then
110
+
111
+ set @sql=concat (@sql,',case sum(t1.did=',a,') when 0 then "" when 1 then "○" end as ',b,' ');
112
+
113
+ end if;
114
+
115
+ until done end repeat;
116
+
117
+ close cur;
118
+
119
+ set @sql=concat (@sql,'from user_doc as t1 ');
120
+
121
+ set @sql=concat (@sql,'group by uid ) as t2 ');
122
+
123
+ set @sql=concat (@sql,'inner join user as t3 on t2.uid=t3.uid ');
124
+
125
+ prepare stmt from @sql;
126
+
127
+ execute stmt;
128
+
129
+ end
130
+
131
+ //
132
+
133
+ delimiter ;
134
+
135
+ ```
136
+
137
+ - 実行
138
+
139
+ ```SQL
140
+
141
+ call myproc;
142
+
143
+ ```