• ベストアンサー

for文の組み合わせ方

PHPで以下のTableからデータを取ってきて 取り扱い表を作成したいと思っています。 Table:SHOPは店舗、Table:ITEMは商品、Table:LINKは 先の二つの紐付けを表します。 DBの保存データは、 Table:SHOP ID  SHOPNAME ------------------- 1   東京 2   大阪 3   福岡 (略) Table:ITEM ID ITEMNAME -------------------- 1  化粧品 2  家具 3  園芸 4  食品 5  家電 (略) Table:LINK ID  SHOP  ITEM --------------------- 1   1    4 2   2    5 3   3    1 4   3    2 (略) となっていて、結果として画面に   |化粧品|家具|園芸|食品|家電| ---------------------------------------- 東京|   |   |   | ○ |   | 大阪|   |   |   |   | ○ | 福岡| ○ | ○ |   |   |   | (略) と表示したいのですが、 $sql="SELECT A.ID,B.SHOPNAME,C.ITEMNAME FROM ・・・・・ としたのでは紐付けを単純に抽出するだけですし、 for文をどう使えば縦列に項目をだして○をつければ いいかがわかりません。 HELPお願いします。

質問者が選んだベストアンサー

  • ベストアンサー
  • hakugen
  • ベストアンサー率36% (8/22)
回答No.2

DBは何を使われているのでしょうか?外部結合で取って来ればそのような形になると思います。 また、Oracleであれば「DECODE」や「CASE」、MySQLであれば「IF」を用いればSQLで「○」も表現できます。(他のDBにもきっと似たようなものがあるのでは。) とりあえず商品だけは先にとっておく。 「SELECT ITEMNAME FROM ITEM ORDER BY ID」 そのあとに結果に表示したい形式で抽出。 「SELECT SHOPID,SHOPNAME,ITEMNAME, IF(L.ITEM=A.ITEMID,'○','') FROM (SELECT I.ID AS ITEMID,S.ID AS SHOPID, SHOPNAME,ITEMNAME FROM ITEM I, SHOP S) A LEFT OUTER JOIN LINK L ON L.ITEM = A.ITEMID AND A.SHOPID = L.SHOP ORDER BY SHOPID,ITEMID」 ちょっと複雑になってしまいましたが、これであとは結果をfor文で回していって、「SHOPID」が変わったら改行すればOKです。

getamato
質問者

お礼

お礼での書き込みになりますが、 追加質問なのですが、 >LEFT OUTER JOIN LINK L >ON L.ITEM = A.ITEMID の時に、LINK LのTableに非表示のフラグがあった 場合で、DELETE=0 という条件を付けたい場合どうしたらいいでしょうか。

getamato
質問者

補足

ありがとうございます。 DBはMySQLを使用しています。 IF、forでの回し方、使い方についてもHELPいただけましたら幸いです。 よろしくお願いします。

その他の回答 (2)

  • hakugen
  • ベストアンサー率36% (8/22)
回答No.3

> の時に、LINK LのTableに非表示のフラグがあった > 場合で、DELETE=0 という条件を付けたい場合どうしたらいいでしょうか。 ORDER句の前に入れれば良いかと。 「・・・・・・ AND A.SHOPID = L.SHOP WHERE DELETE = 0 ORDER BY SHOPID,ITEMID」 とりあえず出力だけを考えるなら・・・。 <?php $sql="ここにSQL文"; $result = mysql_query($sql,$con); $output = array(); //結果を格納する配列 while ($row = mysql_fetch($result)) { if($output["SHOPNAME"] == NULL) $output["SHOPNAME"] = array(); array_push($output["SHOPNAME"], $row["ITEMNAME"]); } ?> <table> <?php foreach($output["SHOPNAME"] as $key => $shop){ echo "<tr><td>".$key."</td><td>|</td>"; foreach($shop as $item) echo "<td>".$item."</td><td>|</td>"; echo "</tr>"; } ?> </table> 見出しの部分に関しては#1さんと同じです。 ただ、MySQLだと5.0でないと副問い合わせが使えないのですが・・・。

getamato
質問者

お礼

ありがとうございます。 まだ消化しきれていないところあり、コメントに感謝です。 自分でもいろいろやってみて、それについて質問しますので またよろしくお願いします。

  • yambejp
  • ベストアンサー率51% (3827/7415)
回答No.1

簡単そうで結構やっかいな質問ですね。 もっとも単純にやるには、 SHOPとITEMとLINKをそれぞれ別に呼び出して、 PHPで合体ささせる方法です。以下の通り。 <?PHP $link = mysql_connect('localhost', 'root', 'koeinet100'); mysql_select_db('test'); $sql="SELECT `ID`,`SHOPNAME` FROM `SHOP`"; $res = mysql_query($sql,$link); while ($rows = mysql_fetch_assoc($res)) { $SHOP[$rows["ID"]]=$rows["SHOPNAME"]; } $sql="SELECT `ID`,`ITEMNAME` FROM `ITEM`"; $res = mysql_query($sql,$link); while ($rows = mysql_fetch_assoc($res)) { $ITEM[$rows["ID"]]=$rows["ITEMNAME"]; } foreach($SHOP as $key1=>$val1){ foreach($ITEM as $key2=>$val2){ $LINK[$key1][$key2]="&nbsp;"; } } $sql="SELECT `SHOP`,`ITEM` FROM `LINK`"; $res = mysql_query($sql,$link); while ($rows = mysql_fetch_assoc($res)) { $LINK[$rows["SHOP"]][$rows["ITEM"]]="○"; } print<<<eof <table border> <thead> <tr> <th>&nbsp;</th> eof; foreach($ITEM as $key2=>$val2){ print "<th>$val2</th>"; } print<<<eof </tr> </thead> <tbody> eof; foreach($SHOP as $key1=>$val1){ print "<tr>"; print "<td>$val1</td>"; foreach($ITEM as $key2=>$val2){ print "<td>{$LINK[$key1][$key2]}</td>"; } print "</tr>"; } print<<<eof </tbody> </table> eof; ?> しかしこれではなんのためにSQLで管理しているか さっぱりわかりません。 そこで応用ですが、ピボットテーブルという 縦軸を横軸に転写するテーブルを作って処理します。 以下、SQL文だけ参考に。 #まずテンポラリでテーブル作成 CREATE TEMPORARY TABLE `TEMP_PIVOT`(`ID` INT,`化粧品` INT,`家具` INT,`園芸` INT,`食品` INT,`家電` INT); #左上から右下にたいして1が入るようにデータを挿入 INSERT INTO `TEMP_PIVOT` VALUES(1,1,0,0,0,0),(2,0,1,0,0,0),(3,0,0,1,0,0),(4,0,0,0,1,0),(5,0,0,0,0,1); #ピボットを使って抽出 SELECT `SHOP`.`ID`,`SHOPNAME` ,SUM(`化粧品`) AS `化粧品` ,SUM(`家具`) AS `家具` ,SUM(`園芸`) AS `園芸` ,SUM(`食品`) AS `食品` ,SUM(`家電`) AS `家電` FROM `SHOP` LEFT JOIN `LINK` ON `SHOP`.`ID`=`LINK`.`SHOP` LEFT JOIN `TEMP_PIVOT` ON `TEMP_PIVOT`.`ID`=`LINK`.`ITEM` GROUP BY `SHOPNAME` ORDER BY `SHOP`.`ID`;

getamato
質問者

補足

応用まで! ありがとうございます。 PHPで結合する方法から勉強していきたいと思うのですが、一点追加で質問させてください。 最終的にはこの画面表示をCSVなりに吐き出したいと思っています。 この場合はPHPでの結合だとどのようにすればいいでしょうか。 よろしくお願いします。

関連するQ&A