とにかくデータの持ち方が悪いです。
まずはuserとdocを分けて、user_docという中間テーブルを持ちます
sql
1create table user(uid int unique,uname varchar(30));
2insert into user values(1,'hoge1'),(2,'hoge2'),(3,'hoge3');
3create table doc(did int unique,dname varchar(30));
4insert into doc values(1,'fuga1'),(2,'fuga2'),(3,'fuga3');
5create table user_doc(uid int,did int,unique(uid,did));
6insert into user_doc values(1,1),(1,2),(1,3),(2,1),(2,3),(3,2),(3,3);
その上で、userテーブルとuser_docテーブルを利用して表をつくります
SQL
1select t1.uid
2,case sum(t1.did=1) when 0 then '' when 1 then '○' end as ID1
3,case sum(t1.did=2) when 0 then '' when 1 then '○' end as ID2
4,case sum(t1.did=3) when 0 then '' when 1 then '○' end as ID3
5,case sum(t1.did=4) when 0 then '' when 1 then '○' end as ID4
6from user_doc as t1
7left join user as t2 on t1.uid=t2.uid
8group by uid;
横方向へIDを自動的に増やしていくのにはプロシージャというもので処理します
今回は煩雑にナリそうなので、上記まで理解することをおすすめします
プロシージャまで
docにfuga4を追記した上でリストを自動でつくります
SQL
1create table user(uid int unique,uname varchar(30));
2insert into user values(1,'hoge1'),(2,'hoge2'),(3,'hoge3');
3create table doc(did int unique,dname varchar(30));
4insert into doc values(1,'fuga1'),(2,'fuga2'),(3,'fuga3'),(4,'fuga4');
5create table user_doc(uid int,did int,unique(uid,did));
6insert into user_doc values(1,1),(1,2),(1,3),(2,1),(2,3),(3,2),(3,3);
SQL
1drop procedure if exists myproc;
2delimiter //
3create procedure myproc()
4begin
5declare a int;
6declare b varchar(100);
7declare done int default 0;
8declare cur cursor for
9select did,dname from doc order by did;
10declare continue handler for sqlstate '02000' set done=1;
11set @sql='select t3.uname,t2.* from (select t1.uid ';
12open cur;
13repeat
14fetch cur into a,b;
15if not done then
16set @sql=concat (@sql,',case sum(t1.did=',a,') when 0 then "" when 1 then "○" end as ',b,' ');
17end if;
18until done end repeat;
19close cur;
20set @sql=concat (@sql,'from user_doc as t1 ');
21set @sql=concat (@sql,'group by uid ) as t2 ');
22set @sql=concat (@sql,'inner join user as t3 on t2.uid=t3.uid ');
23prepare stmt from @sql;
24execute stmt;
25end
26//
27delimiter ;
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2018/03/22 09:44
2018/03/24 08:49
2018/03/24 11:06
2018/03/25 15:40 編集