- ベストアンサー
セルの結合
失礼いたします。 次のようにテーブルを表示したいのですが、 調べてもよくわからない(載ってない)ので 教えていただきたいです。 --------------------- No | Name | email --------------------- |______|_________ ____|______|_________ ____|_____ |_______ ・・・・ ・・・・ つまり、Noが同じレコードはNo部分のみを 結合して表示させたいのです。 よろしくお願いします。m(__)m 表示がうまくいかないですが・・
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
#3回答者です。 質問内容はアプリケーションでやればすごく簡単な処理で、SQLだけでやろうとするとオーバヘッドの大きいものになってしまいます。 MySQL 5.0以降ならストアド・プロシジャを使えるので、これを活用すればオーバヘッドのない処理にできます。 (1)ストアド・プロシジャ定義 drop procedure if exists edit_no; delimiter // create procedure edit_no (out rc tinyint, out msg varchar(80)) begin declare loop_cnt int; declare row_seq_no int; declare o_no smallint; declare o_name varchar(20); declare o_email varchar(30); declare sv_no smallint; declare w_no_name varchar(31); declare cr1 cursor for select * from t1 order by no; -- エラーなら、終了 declare exit handler for sqlexception set rc=12,msg='*** insert error ***'; -- 作業用の表を作成 create temporary table if not exists wt1 (`rownum` int, `no_name` varchar(23), `email` varchar(30)); truncate table wt1; set rc=0,msg=''; -- 検索すべき行数を得る select count(*) into loop_cnt from t1; -- 準備 set o_no=0; set sv_no=0; set row_seq_no=0; -- 検索して、作業用の表に格納 open cr1; while loop_cnt>0 do fetch cr1 into o_no,o_name,o_email; if o_no>0 then set row_seq_no=row_seq_no+1; if o_no=sv_no then set w_no_name=o_name; else set w_no_name=concat(cast(o_no as char(2)),' ',o_name); end if; insert into wt1 values(row_seq_no,w_no_name,o_email); set sv_no=o_no; end if; set loop_cnt=loop_cnt-1; end while; close cr1; -- 格納した結果の表示 select `no_name`,`email` from wt1 order by rownum; end; // delimiter ; (2)ストアド・プロシジャの実行 call edit_no(@rc,@msg);
その他の回答 (3)
- chukenkenkou
- ベストアンサー率43% (833/1926)
MySQLのバージョンは、5.0以降でしょうか? 表示方法を変えたいだけのために、以下のようなことをやらなければならないと思います。 (1)Noでソートした結果の各行に、通し番号を付ける。 (2)(1)の通し番号=1の行を検索 (3)(1)の通し番号が、nの行とn+1の行を比較し、 Noが一致ならNoを表示しない(emailに連結しない)。 Noが不一致ならNoを表示する(Noとemailを連結する) ※n>1 表示を変えるためだけに、オーバーヘッドが大きくなります。それでも、今の考え方で実施する必要が、本当にあるのでしょうか? 美しくないSQLですが、取りあえず作ってみました。 MySQL 5.0以降が前提です。 create table t1 (`no` smallint, `name` varchar(20), `email` varchar(30)); insert into t1 values (1,'hyuga','mail1'), (1,'ryoma','mail2'), (2,'roma','mail3'), (2,'yokohama','mail4'), (2,'kawasaki','mail5'), (3,'odawara','mail6'), (4,'fujisawa','mail7'), (4,'yokosuka','mail8'); set @rn0=0; set @rn1=0; set @rn2=0; select concat(cast(w2.`no` as char(2)),' ',w2.`name`) as `no name`, w2.`email` from (select @rn0:=@rn0+1 as `rn0`,`no`,`name`,`email` from t1 order by `no`) as w2 where `rn0`=1 union select case when w1.`no`=w2.`no` then w2.`name` else concat(cast(w2.`no` as char(2)),' ',w2.`name`) end as `no name`, w2.`email` from (select @rn1:=@rn1+1 as `rn1`,`no`,`name`,`email` from t1 order by `no`) as w1, (select @rn2:=@rn2+1 as `rn2`,`no`,`name`,`email` from t1 order by `no`) as w2 where `rn1`+1=`rn2` ;
- Ikonos00
- ベストアンサー率28% (86/302)
何に表示させたいのですか?
補足
ここの方が見やすいのでこちらに返信させていただきます。 No1さん、No2さん、ご回答ありがとうございました。 表示させたい対象はブラウザ上(コンソール)にです。 データベースの管理をモニター上で行っているのですが、ユーザビリティーの改善のためにこの質問をさせて頂いております。よろしくお願いします。 データの例なのですが No Name email 1 hyuga mail1 1 ryoma mail2 2 roma mail3 を No Name email 1 hyuga mail1 ryoma mail2 2 roma mail3 のように表示したいです。 ここで、1はひとつになり、 次は何も表示されないか ____ | 1 | | | ____| のように仕切りをとってしまいたいのです。 よろしくお願いいたします。
- chukenkenkou
- ベストアンサー率43% (833/1926)
元のデータと、表示したいデータの例を示して 説明できませんか?
お礼
ご回答ありがとうございました。 丁寧なご回答、本当にありがとうございます。 ただ現時点の自分では上記内容を理解しようとしても けんもほろろでした。 #3で答えていただいた考え方は何とか理解できています。ほかのサイトを参照してSQLの入れごになった例を簡単なものから理解していきます。m(__)m