MAIN_ID SUB_ID1 SUB_NOTE1 SUB_ID2 SUB_NOTE2
これはSQL的は出力の項目数が不定で、項目名も不定になるのでNG
PHP的にも出力される項目名が可変では任意のデータを抽出できないのでNGですね
どうせPHPで取得するのでしたら2行でうけて1行に集約すれば良いのでは?
PHP
1 $sql="SELECT MAIN_ID,SUB_ID,SUB_NOTE FROM tbl";
2 $stmt = $pdo->query($sql);
3 $rows=[];
4 while($row=$stmt->fetch(PDO::FETCH_ASSOC)){
5 $rows[$row["MAIN_ID"]][]=[$row["SUB_ID","SUB_NOTE"]];
6 }
のようなとり方をするとかで対応してみてください
sample
SQLでやる簡単なサンプルを付けておきます
SQL
1create table tbl(mid int,sid int unique,snote varchar(20));
2insert into tbl values
3(1,1,'a'),
4(1,2,'b'),
5(1,3,'c'),
6(1,4,'d'),
7(2,5,'e'),
8(2,6,'f'),
9(2,7,'g'),
10(3,8,'h'),
11(4,9,'i'),
12(4,10,'k');
SQL
1select mid
2,group_concat(case rank when 1 then sid end) as sid1
3,group_concat(case rank when 1 then snote end) as snote1
4,group_concat(case rank when 2 then sid end) as sid2
5,group_concat(case rank when 2 then snote end) as snote2
6,group_concat(case rank when 3 then sid end) as sid3
7,group_concat(case rank when 3 then snote end) as snote3
8,group_concat(case rank when 4 then sid end) as sid4
9,group_concat(case rank when 4 then snote end) as snote4
10from(
11select mid,sid,snote,(select count(*)+1 from tbl as t2 where t1.mid=t2.mid and t1.sid>t2.sid) as rank
12from tbl t1
13) as b
14group by mid
15
上記元データはmid=1のデータが4つあると目視できるため4列書いていますが
実際にはいくつあるかは状況によって違うでしょう
原則としてgroup_concatの部分は手書きでしかSQLは指定できないので、
これをループさせて羅列する処理をprocedureで書くわけです
興味があるようならprocedureの書き方も例示します
procedure
横方向への羅列するprocedure
SQL
1drop procedure if exists proc_yoko_hyoji;
2delimiter //
3create procedure proc_yoko_hyoji()
4begin
5declare cnt int;
6declare len int;
7select count(*) into len from tbl group by mid order by len desc limit 1;
8set @sql="select mid";
9set cnt=1;
10while cnt<=len DO
11set @sql=concat(@sql
12,",group_concat(case rank when ",cnt," then sid end) as sid",cnt
13,",group_concat(case rank when ",cnt," then snote end) as snote",cnt
14);
15set cnt=cnt+1;
16end while;
17set @sql=concat(@sql
18," from ( "
19,"select mid,sid,snote,(select count(*)+1 from tbl as t2 where t1.mid=t2.mid and t1.sid>t2.sid) as rank "
20,"from tbl as t1 "
21,") as sub "
22,"group by mid "
23);
24prepare stmt from @sql;
25execute stmt;
26end
27//
28delimiter ;
※上記を一度つくっておけばあとは、データ更新などがあっても以下を実行するだけです
SQL
1call proc_yoko_hyoji;
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2017/11/10 04:09
2017/11/10 04:25
2017/11/10 04:27
2017/11/10 05:21
2017/11/10 05:55
2017/11/10 08:08