質問: お世話になります。 先日、同じタイトルで上記にて質問しましたが、同じテーブルにてまた別のことを伺いたく質問させてください。 memberテーブル no name sex 1 佐藤 man 2 伊東 woman 3 金井 man 4 渡辺 woman like_dataテーブル data_no data_name 1 いちご 2 みかn 3 すいか 4 ぶどう 5 レモン 6 バナナ like_memberテーブル(上記テーブルを基にしたメンバーが好きなものリスト) like_no like_member_no like_data_no 1 1 2 2 2 2 3 1 3 4 3 3 5 1 4 6 2 4 7 3 4 8 4 1 9 4 2 10 4 4 ※like_member_noは、memberテーブルのnoと紐づく ※like_data_noは、like_dataテーブルのdata_noと紐づく とここ質問ですが、以下のようにメンバーを一覧で表示させつつ、そこに紐づく好きな(果物)を段を変えて表示させたいと考えているのですが、このような場合、like_memberテーブルを基本とし、該当するデータを全件取得し、PHPで表示を操作する方が良いのか?それともSQLで一発で取得することが出来るのか?(その場合、サンプルで構いませんのでどのようなSQLとなるのか併せて)ご教示いただければ幸いです。 よろしくお願いいたします。 1 佐藤 man . みかん . すいか . ぶどう 2 伊東 woman . みかん . ぶどう 3 金井 man . すいか . ぶどう 4 渡辺 woman . いちご . みかん . ぶどう ※「.」はレイアウトを整えるためのものです。 ■ mts10806さん、Orlofskyさんへのお返事 ご指摘ありがとうございます。至らぬことあり申し訳ありません。 以降、気をつけたいと思います。
回答: * 元データ ※同じような質問するなら元データくらいSQL文で提示してください ``` create table member(no int primary key,name varchar(20),sex varchar(20)); insert into member values (1,'佐藤','man'), (2,'伊東','woman'), (3,'金井','man'), (4,'渡辺','woman'); create table like_data(data_no int primary key,data_name varchar(20)); insert into like_data values (1,'いちご'), (2,'みかん'), (3,'すいか'), (4,'ぶどう'), (5,'レモン'), (6,'バナナ'); create table like_member (like_no int primary key,like_member_no int,like_data_no int); insert into like_member values (1,1,2), (2,2,2), (3,1,3), (4,3,3), (5,1,4), (6,2,4), (7,3,4), (8,4,1), (9,4,2), (10,4,4); ``` * 検索 ``` select no,name,sex as val,1 as sort1,0 as sort2 from member union all select t1.no,t1.name,t3.data_name,2,t2.like_no from member as t1 inner join like_member as t2 on t1.no=t2.like_member_no inner join like_data as t3 on t2.like_data_no=t3.data_no order by no,sort1,sort2; ``` 表示調整 ==== ``` set @no=null,@name=null; select if(@no=no,'',@no:=no) as no, if(@name=name,'',@name:=name) as name, val from( select no,name,sex as val,1 as sort1,0 as sort2 from member union all select t1.no,t1.name,t3.data_name,2,t2.like_no from member as t1 inner join like_member as t2 on t1.no=t2.like_member_no inner join like_data as t3 on t2.like_data_no=t3.data_no ) as sub order by sub.no,sub.sort1,sub.sort2; ```