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`
;
お礼
ご回答ありがとうございました。 丁寧なご回答、本当にありがとうございます。 ただ現時点の自分では上記内容を理解しようとしても けんもほろろでした。 #3で答えていただいた考え方は何とか理解できています。ほかのサイトを参照してSQLの入れごになった例を簡単なものから理解していきます。m(__)m