MySQLでグループごとに見出しをつける方法

このQ&Aのポイント
  • MySQLのmysql_fetch_array関数を使用して、グループごとに見出しをつける方法を紹介します。
  • 指定したテーブルからデータを取得し、グループごとに見出しを表示するコード例を示します。
  • この方法を使えば、野菜、くだもの、お菓子などのグループごとにデータを表示することができます。
回答を見る
  • ベストアンサー

mysql_fetch_arrayを使って、グループのあいだごとに見出

mysql_fetch_arrayを使って、グループのあいだごとに見出しをつけたい。 イミフなタイトルで申し訳ないです。 やりたいことが明確化しているので、そちらからご説明させてください。 【用意したテーブル】 eat groupid , group , eatid , eat 1 , 野菜 , 1 , なす 1 , 野菜 , 2 , ピーマン 1 , 野菜 , 3 , にんじん 1 , 野菜 , 4 , レタス 2 , くだもの , 5 , りんご 2 , くだもの , 6 , みかん 2 , くだもの , 7 , 梨 2 , くだもの , 8 , ぶどう 3 , お菓子 , 9 , ぽてち 3 , お菓子 , 10 , ポッキー 3 , お菓子 , 11 , チョコ 3 , お菓子 , 12 , せんべい ・ ・ ・ 【やりたい見せ方】 ■野菜関連 なす ピーマン にんじん レタス ■くだもの関連 りんご みかん 梨 ぶどう ■お菓子関連 ぽてち ポッキー チョコ せんべい ・ ・ ・ 【実際に組んでいるソース】(といいますか、普通に回しているだけですが。。) $sql = "select * from eat"; $result = mysql_query($sql); $rows = mysql_num_rows($result); while($row = mysql_fetch_array($result)){ echo "<p>"; echo $row["eat"]; echo "</p>"; } このソースの状態で、 さきほどのやりたいことのように、グループの上に見出しをつけるにはどのように記述を追加すればよいのでしょうか?? また、ソースに特にこだわ入りはないので、全然変えていただいて構いません。 宜しくお願い致します。 ご不明な点などございましたらいつでもお気軽におっしゃって頂けますと幸いです。

  • PHP
  • 回答数4
  • ありがとう数7

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

  • ベストアンサー
回答No.4

whileの前と後ろをtableで囲む形にすればできます。 5行追加置換と前の回答修正1行。 $sql = "select * from eat ORDER BY groupid,eatid"; // 修正。順番を守らせるため $result = mysql_query($sql); $rows = mysql_num_rows($result); $before_groupid = 0; $current_groupid = 0; echo "<table>"; // 追加 while($row = mysql_fetch_array($result)){ $current_groupid = $row["groupid"]; if($current_groupid > $before_groupid){ echo "<tr><td>■".$row["group"]."関連</td></tr>"; // 入れ替え } $before_groupid = $current_groupid; echo "<tr><td>"; // 入れ替え echo $row["eat"]; echo "</td></tr>"; // 入れ替え } echo "</table>"; // 追加

hasu23
質問者

お礼

何度も何度も本当にすいません!無事できました! 本当にありがとうございました!! これを応用してビシバシ作っていきたいと思います! 本当にありがとうございました!!

その他の回答 (3)

回答No.3

データがどんな順番に並んでても構わないはず。   class CGroup { public $group; public $eat = array(); } $sql = "select * from eat"; $result = mysql_query($sql); $group = array(); while($row = mysql_fetch_array($result)){ if (!isset($group["$row[groupid]"])) { $group["$row[groupid]"] = new CGroup; $group["$row[groupid]"]->group = $row["group"]; } $group["$row[groupid]"]->eat[] = $row["eat"]; } foreach($group as $elem) { echo "<p>"; echo "<br>■".($elem->group)."関連<br><br>"; foreach($elem->eat as $item) { echo $item."<br>"; } echo "</p>"; } 手元に環境がないので動作確認はしていません。

hasu23
質問者

お礼

ご回答ありがとうございます! ご丁寧にご回答いただきましてありがとうございました!! ただ、自分的には少し応用していろいろ使おうと思っていたので、 echo "<p>"; echo $eat; echo "</p>"; 的なもので作っていただきたかったです。。 (ここは完全に私のご説明不足で、magicalpassさんには一切の非はございません!!) ありがとうございました!!

回答No.2

7行追加でOK。 $sql = "select * from eat"; $result = mysql_query($sql); $rows = mysql_num_rows($result); $before_groupid = 0; // 追加 $current_groupid = 0; // 追加 while($row = mysql_fetch_array($result)){ $current_groupid = $row["groupid"]; // 追加 if($current_groupid > $before_groupid){ // 追加 もっとも重要な行 echo "<h1>■".$row["group"]."関連</h1>"; // 追加 } // 追加 $before_groupid = $current_groupid; // 追加 echo "<p>"; echo $row["eat"]; echo "</p>"; }

hasu23
質問者

お礼

ご回答ありがとうございます!! 7行追加でOK。というモチベーションの上がるキャッチに誘われて一番に試させていただきました!! 結果、無事にできました!!本当にありがとうございます!! また、重ねての質問で恐縮なのですが、 echo "<p>"; echo $row["eat"]; echo "</p>"; の部分を本当は echo "<table>"; echo "<tr><td>"; echo $eat; echo "</tr></td>"; echo "</table>"; で組んでいまして。。 これはどうにもなりませんでしょうか? 本当はもう少し複雑なデザインにしていて、テーブルで作りたいと思っておりまして。。 もしテーブルでできないようでしたら、できないよばか!とののしってください!!

  • duron
  • ベストアンサー率77% (73/94)
回答No.1

キレイなやり方じゃないかもしれませんが・・・ 私はこういうとき、一度二次元配列($a[groupid][eatid]=eat)に取り込んでから出力するようにしてます。 $sql = "select * from eat"; $result = mysql_query($sql); $rows = mysql_num_rows($result); $grouplist=array(); $eatlist=array(); // 二次元配列の生成(ついでにグループ名称のリストも生成) while($row = mysql_fetch_array($result)){ if(!isset($grouplist[$row["groupid"]])) { $grouplist[$row["groupid"]]=$row["group"]; } $eatlist[$row["groupid"]][$row["eatid"]]=$row["eat"]; } // リストの出力 foreach($eatlist as $key1 => $subeatlist) { echo "■".$grouplist[$key1]."関連<br>"); foreach($subeatlist as $key2 => $eat) { echo "<p>"; echo $eat; echo "</p>"; } } 動作確認してないので間違いがあったらごめんなさい。 SQLでのORDER BYもしくは配列のソートが適時必要になると思います。

hasu23
質問者

お礼

duron様 ご回答ありがとうございます!duron様は以前にもお助けいただいて本当に感謝しております。(前回は、フォームの件でベストアンサーを送らせていただいた者です。ちなみに、この質問は前回のフォームに付け加えたいことの続きです(笑)) さっそく試させていただきました! 初めやった時は画面が白くなってしまいましたが、自分なりに echo "■".$grouplist[$key1]."関連<br>"); の ) を外したりしてみたらなんとかできました。ありがとうございました! 実は、、上記にご説明していないことがありまして。。 echo "<p>"; echo $eat; echo "</p>"; のことなのですが、テーブルで組んでいまして、 echo "<table>"; echo "<tr><td>"; echo $eat; echo "</tr></td>"; echo "</table>"; みたいな感じで組んであります。 これは何とかなりませんでしょうか・・・? (すいません! tableで組んでるということを失念してご質問でしてしまいました。。)

関連するQ&A

  • mysql,GROUP BY,mysql_fetch_arrayを使っ

    mysql,GROUP BY,mysql_fetch_arrayを使って、あるフィールドに入ってる項目を複数出したい。 わかりづらいタイトルで申し訳ありません。 ある項目を、登録数の多い順に一覧表示をし、それに関するコメントを表示と思っています。 countで数を取り、GROUP BYでまとめ、order byで並び変えをしています。 しかし、おそらくGROUP BYでまとめているせいで、本来フィールドに複数入っているものが1つしか出てきません。現在の環境とやりたいことをまとめさせていただきます。 【関連するテーブル】 game  構造  titleid , title 1 , 鬼武者3 2 , FF10 3 , ヴィーナス&ブレイブス ~魔女と女神と滅びの予言~  ・  ・  ・ (本当はもう少し複雑ですが、今回の質問にはあまり関係がないためは省略しております) tag  構造  tagid , tag  1 , OPが素晴らしい  2 , EDが素晴らしい  3 , 世界観がいい  ・  ・  ・ tag_title  構造  tagid , titleid , tagcom , tagcom_date(日付)  1 , 1 , すばらしい , 2010-09-05 1 , 1 , やってよかった , 2010-09-05 1 , 2 , よくできている , 2010-09-05  ・  ・  ・ 上記3つのテーブルをメインに使います。 【表示したいこと】   OPがいいゲーム    鬼武者3  登録数 : 3件    タグコメント: すばらしい(2010-09-05) / やってよかった(2010-09-05)  ・  ・  ・ 実際のページです ttp://www.game-minzoku.jp/tag.php?tagid=1 【組んだソース】 (CSSやら他のを省略) $sql = "select * ,count(game.title)as count from game left join tag_title on game.titleid = tag_title.titleid left join tag on tag_title.tagid = tag.tagid where tag_title.tagid = '{$tagid}' GROUP BY title order by count desc "; $result = mysql_query($sql); $rows = mysql_num_rows($result); while($row = mysql_fetch_array($result)){ echo "登録数 : "; echo $row["count"].件; echo "<img src=\"",$row["img"],"\" alt=\"",$row["title"],"\" width=\"100\">"; echo $row["title"]; echo "タグコメント : "; if ($row["tagcom"] != ""){ echo $row["tagcom"]; echo " (" . $row["tagcom_date"] . ") / "; } } です。 前述もさせていただきましたが、おそらくGROUP BYでまとめると、1つしか出ないとかそんな感じだとは思うのですが、どうやって解消したら良いのかがわかりません。。。 (ttp://www.game-minzoku.jp/tag.php?tagid=1 が実際のページですが、タグコメントが複数登録されているものも、1つしか出てこなくなっている感じです) 拙いご説明で本当に恐縮ですが、もしお分かりになりましたらよろしくお願いします。 説明不足の点などあればおっしゃってください!

    • ベストアンサー
    • PHP
  • mysql_fetch_array の関数について

    はじめまして、お世話になります。 php/SQL共に初心者レベルなのですが、ご指導ください。 mysql_fetch_array のSQLの結果が複数件ある場合なのですが、 参考書通り $sql = "select * from category where parent_id = '0' order by category_name"; $result = mysql_query( $sql ); while ( $category = mysql_fetch_array( $result ) ) echo "<a href=result.php?category_id=${category['category_id']}>${category['category_name']}</a> | "; とコーディングしたものの、 Warning: mysql_fetch_array(): supplied argument is not a valid MySQL result resource in /home/アカウント名/public_html/アカウント名/topbar.php on line 26 とエラーが表示され困っています。 参考書にもエラーの詳細など記載れていませんし、他の媒体での色々と答えを探してはみたものの意味がわかりません。 解る方いらっしゃいましたら是非ご指導ください。 宜しくお願いします。

    • 締切済み
    • PHP
  • mysql_fetch_array の速度について

    DBに入れたアクセスログの集計で困ったことがあります。 phpMyAdmin でSQLを作成し実行すると、1秒で済むのですがPHPにして、ブラウザからアクセスすると5分以上かかります。ちなみにアクセスログの行数は10万行ほど。 問題のPHPのコードは下記です。 -- $sql = 'SELECT path, COUNT(path)AS cnt FROM `logs` ' . ' WHERE `path` LIKE \'/news.php?id=%\' ' . ' AND TO_DAYS(NOW()) - TO_DAYS(date) <= 7' . ' GROUP BY path ' . ' ORDER BY `cnt` DESC ' . ' LIMIT 0 , 3'; $res = mysql_query($sql,$dbh) or die(mysql_error()); while ($row = mysql_fetch_array($res)) { echo $row[path]; echo "(".$row[$cnt].")<br>"; } -- mysql_fetch_array のところが問題なのかなと考えております。 お分かりになる方、是非アドバイスをお願いします。

    • 締切済み
    • PHP
  • mysql_fetch_objectにデータを取得させたいのですが、うまく行きません。

    データ型 name varchar(30), item1 char(8), item2 int(6) で、テーブルが下記のようなっています。 | name |item1 | item2 | | taro | abcd | 53 | | taro | efghk | 48 | | taro | lmnp | 02 | while文で array_push($ydata, $row->item1) として $row = mysql_fetch_object($result) にデータを取得させたいのですが(スクリプト下記)、 $conn_id = mysql_connect("localhost","***","***") or die('Error connecting to MySQL'); mysql_select_db('***',$conn_id); $query ="SELECT item1,item2 from XYZ where name='taro'"; $result = mysql_query($query,$conn_id) or die($query.'failed('.mysql_error().')'); $ydata = array(); while($row = mysql_fetch_object($result)){   ←10行目 // array_push($ydata, $row->item1);      //  ここに下記の13、14行目を追記 } var_dump($row);echo"<br />\n"; var_dump($result); print_r($row); echo"<br />\n"; これでブラウザから見ると bool(false) resource(3) of type (mysql result) としか出ません。(19行目の結果は表示されません。) そのため 13: echo "item1",$row['item1'],"<br>"; 14 echo "item2",$row['item2'],"<br>"; と追記してブラウザから見ると、単に [ item1 ]とだけ表示されます。 10 行目を while($row = mysql_fetch_arrayt($result)){ に変えてブラウザから見ると item1abcd item253 imem1efghk item250 item1lmnp item258 bool(false) resource(3) of type (mysql result)   となります。 $row = mysql_fetch_object($result) にデータを取得させるにはどのように修正すれば良いのでしょうか?

    • ベストアンサー
    • PHP
  • mysql_fetch_assoc()の非推奨

    phpを始めてまだ数ヶ月の初心者です。 (少々表現が変なところはお許し下さい。) ■やりたい事 phpである登録画面を作成しています。サーバーには スタッフのデーターが入っているテーブルがあります。 (1)DBに登録してあるスタッフの名前を全部引っ張り出す(mysql)。 (2)登録画面の入力項目の1つとして(登録スタッフ)があり、  そこを<select>で上記(1)から取り出したものを自動で表示したい。 ところが、mysql_fetch_assoc()について調べたら、非推奨などと載っていて (内容がよく理解できませんでしたが)どのように記述したら、将来困らない  コーディングとなりますか? <select name="register"> <?php $sql = "select count_ID, name from reserve"; $result = mysql_query($sql); while ($row = mysql_fetch_assoc($result)) { echo "<option value=\"".$row["count_ID"]."\">" .$row["name"]."</option>"; } ?> </select> 今からphpの知識を少しづつつけていくにあたり、非常に混乱して います。mysqlをそもそも学んでいてもしょうがないということでは ないですよね。本当に初心者なので、お手数ですがわかりやすい表現 でお願いします。 よろしくお願いします。

    • ベストアンサー
    • PHP
  • mysql_fetch_rowが 1 を返すことがある

    プログラムコードが多いのですべては載せられないのですが $rid = mysql_query($query = "select base from boards where base='$base'");//base は text型 $rid || die("$query :" . mysql_error() . "\n"); echo "rid: $rid \n"; if (! mysql_fetch_row($rid)) { // そんな行は無い場合の処理・・・ } という箇所で、ときどき rid: 1 Warning: mysql_fetch_row(): supplied argument is not a valid MySQL result resource in /path/ to/htdocs/collect.php on line xx という警告が出ることがあります。 mysql_query()でselect文のクエリを発行した場合は成功時にリソースID、クエリ失敗時に FALSE を返すとマニュアルにはあります。 たしかに上記部分が正常に動作する場合は、 rid: Resource id #102 といったリソースIDが表示されます。 では単純に 1 を返す場合は何を意味しているのでしょうか?

    • ベストアンサー
    • PHP
  • fetch_arrayで期待する値が返ってこない

    こんにちは PHP初心者です。 ハマってしまったので助けてください。 先にソース書きます↓ ------------------------- $sqlStr = "SELECT fld1 FROM table1 WHERE fld2 = '$aaa' AND fld3 = '$bbb' AND fld4 = '$ccc'"; $rsd = mysql_query($sqlStr, $Conn); $rsd_rows = mysql_num_rows($rsd); echo "rsd_rows= ".$rsd_rows."\n"; $rsd_array = mysql_fetch_array($red, MYSQL_ASSOC); foreach( $rsd_array as $key => $value ) { echo "Key= ".$key." Value= ".$value."\n"; } ------------------------- 結果↓ rsd_rows= 50 Key= ABC Value= XYZ ------------------------- $rsd_rowsには50が返されおり、それは正しい数値です。 ところが$rsd_arrayはなぜか結果の最初の一行しか返されていません。 どこかを間違ってるのはわかりますが、どこが問題なのかわからないです。 $rsd_arrayに50行分のデータすべてを取得するには、どうしたらいいですか? よろしくお願いします。

    • ベストアンサー
    • PHP
  • PHP mysql_fetch_assocについて

    いつもお世話になっております。早速ですが下記のソースにて、SQLのクエリではレコードが2行(phpMyAdminで確認)出てきます。何故whileが繰り返してくれないのか分からず悩んでおります。($counterも2で止まる)長文でお手数ですがどうかお力添えの程お願い致します。(文字数制限にてSQL文は省略してます) $sql = "SELECT * FROM 省略"; $res = mysql_query($sql,$conn); echo "<form method=\"POST\" action=\"edit.php\">"; echo "<table class=\"login mb10\" border=\"1\" cellspacing=\"0\" width=\"650\">"; echo "<tr><td class=\"form\">日にち</td><td class=\"form\" colspan=\"3\">".$date."</td></tr>"; $counter = 1; //これが繰り返してくれない while($stadium = mysql_fetch_assoc($res)){ //2回目以降はtableタグを付加 if($counter > 1){echo "<table>";} echo "<tr><td>試合順</td><td colspan=\"2\">".$counter."試合目</td><td>対象</td></tr>"; echo "<tr><td>対戦カード・時間</td><td>"; //チーム情報 $sql = "SELECT * FROM 省略"; $res = mysql_query($sql,$conn); echo "<select name=\"team1_".$counter."\">\n"; while($team1 = mysql_fetch_assoc($res)){ echo "<option value=\"".$team1["team_id"]."\""; if($row["team1"] == $team1["team_id"]){echo " selected";} echo ">".$team1["team_name"]."</option>\n"; } echo "</select>対"; $sql = "SELECT * FROM 省略"; $res = mysql_query($sql,$conn); echo "<select name=\"team2_".$counter."\">\n"; while($team2 = mysql_fetch_assoc($res)){ echo "<option value=\"".$team2["team_id"]."\""; if($stadium["team2"] == $team2["team_id"]){echo " selected";} echo ">".$team2["team_name"]."</option>\n"; } echo "</select></td>\n"; //時刻を反転させる $date_s = strrev($stadium["schedule_time"]); $minute_s = strrev(substr($date_s,0,2)); $hour_s = strrev(substr($date_s,2,2)); echo "<td><select name=\"hour_".$counter."\">"; $hour = 8; while($hour < 22){ echo "<option value=\"".$hour."\" "; if($hour_s == $hour){echo "selected";} echo ">".$hour."</option>"; $hour ++; } echo "</select>時"; echo "<select name=\"minute_1\">"; $minute = 0; while($minute < 60){ echo "<option value=\"".$minute."\" "; if($minute_s == $minute){echo "selected";} echo ">".$minute."</option>"; $minute = $minute + 15; } echo "</select>分</td>\n"; //チェック echo "<td rowspan=\"2\"><input type=\"checkbox\" name=\"delete_".$counter."\" value=\"1\"></td></tr>\n"; echo "<tr><td class=\"form\">審判・場所</td><td>"; //チーム情報 $sql = "SELECT * 省略"; $res = mysql_query($sql,$conn); echo "<select name=\"umpire1_".$counter."\">"; while($umpire1 = mysql_fetch_assoc($res)){ echo "<option value=\"".$umpire1["team_id"]."\" "; if($umpire1["team_id"] == $stadium["umpire1"]){echo "selected";} echo ">".$umpire1["team_name"]."</option>"; } echo "</select>&"; $sql = "SELECT * FROM 省略"; $res = mysql_query($sql,$conn); echo "<select name=\"umpire2_".$counter."\">"; while($umpire2 = mysql_fetch_assoc($res)){ echo "<option value=\"".$umpire2["team_id"]."\" "; if($umpire2["team_id"] == $stadium["umpire2"]){echo "selected";} echo ">".$umpire2["team_name"]."</option>"; } echo "</select></td>\n"; //球場データ $sql = "SELECT * FROM 省略"; $res = mysql_query($sql,$conn); echo "<td>"; if($counter == 1){ echo "<select name=\"stadium_".$counter."\">"; while($sta = mysql_fetch_assoc($res)){ echo "<option value=\"".$sta["stadium_id"]."\" "; if($sta["stadium_id"] == $stadium["stadium"]){echo "selected";} echo ">".$sta["stadium_name"]."</option>"; } echo "</select>"; }else{ echo "&nbsp;"; } echo "</td></tr>\n"; echo "</table>"; $counter++; } echo "<table>変更するテーブル</table>"; echo "</form>";

    • ベストアンサー
    • PHP
  • mysql結果を使ってもう1度mysql検索

    DB(mysql)とプログラムが以下のようにあります。 <?php /////////////////テーブルAを検索//////////////////////// $db = mysql_connect("***","***","***"); mysql_select_db("*****",$db); $result = mysql_query("select * from tableA where day = 0601",$db); if ($myrow = mysql_fetch_array($result)) { do { printf("<font color=\"blue\">$myrow[name]$myrow[day]</font><br>"); } while ($myrow = mysql_fetch_array($result)); } else { echo ""; } ////////結果を使ってテーブルAをもう1度検索///////////// $db = mysql_connect("***","***","***"); mysql_select_db("*****",$db); $result = mysql_query("select * from tableA where sports = '$myrow[day]'",$db); if ($myrow = mysql_fetch_array($result)) { do { printf("<font color=\"green\">$myrow[mise]$myrow[name]</font><br>"); } while ($myrow = mysql_fetch_array($result)); } else { echo ""; } ?> テーブルA name | day | sports | A君 | 0511 | バスケット | A君 | 0601 | サッカー | B君 | 0601 | テニス | B君 | 0503 | 水泳 | C君 | 0602 | 競歩 | C君 | 0512 | 乗馬 | dayが0601のA君とB君のsports全部を結果として表示したいのですが、エラーが出たりして思ったようにはできませんでした。 $resultなどが重複してしまうらしいのです。 A君 「バスケット・サッカー」 B君 「テニス・水泳」 と、するにはどうすればいいのでしょうか?よろしくお願いしますm(_ _)m

    • 締切済み
    • PHP
  • mysql_queryでDB検索をしたいが、結果が表示できない

    MYSQL関数の練習で、以下のソースを実行しました。selectDBなどの部分は省いております。 $sql_keyword = ereg_replace("[[:blank:]]+","%\" and name LIKE \"%",trim($word)); $sql = "SELECT * FROM shop where name LIKE \"%$sql_keyword%\""; $result = mysql_query($sql) or die('Query failed: ' . mysql_error()); echo "<table>\n"; while ($line = mysql_fetch_array($result, MYSQL_ASSOC)) { echo "\t<tr>\n"; foreach ($line as $col_value) { echo convert("\t\t<td>$col_value</td>\n"); } echo "\t</tr>\n"; } echo "</table>\n"; mysql_free_result($result); で行うも、エラーなども無く、結果がブランクになってしまいます。 検索する文字列($WORD)に該当するレコードは複数存在します。 エラーなどもないため、原因がわかりません。皆様のお力をお借りできればと存じます。よろしくお願いいたします。

    • ベストアンサー
    • PHP