MySQLからPHPでデータを抽出し、重複データをまとめつつ、別のカラムを件数カウント表示する方法

このQ&Aのポイント
  • MySQLからPHPでデータを抽出し、重複データをまとめつつ、別のカラムを件数カウント表示する方法について教えてください。
  • また、別のページへリンクしてデータを移動・表示する方法も知りたいです。
  • 開発環境はPHP Version 5.2.11とMySQL (5.0)です。データの総数は東京都内のみで約1000件です。どのような勉強が必要でしょうか?
回答を見る
  • ベストアンサー

MySQLからPHPでデータを抽出し、重複データをまとめつつ、別のカラ

MySQLからPHPでデータを抽出し、重複データをまとめつつ、別のカラムを件数カウント表示し、さらに別のページへリンクしてデータを移動・表示したいです。 いつも利用させていただており、参考にさせていただいております。 さて、40の手習いということで、今更ながらPHPとMySQLを使ってwebページの構築なぞ始めて1週間になります。 そこで、かなり手詰まってしまって、思い切って質問をさせていただきました。 まずは、私の開発環境ですが ・PHP Version 5.2.11 ・MySQL (5.0) そこでやりたいことです。 TABLE `clinic` ID,name,erea,chiiki,genre,tel 1,A店,新宿区,歌舞伎町,歯科医院,03-1234-5678 2,B店,新宿区,歌舞伎町,内科,03-1111-2222 3,C店,新宿区,歌舞伎町,内科,03-3333-4444 4,D店,新宿区,大久保,歯科医院,03-5555-6666 5,E店,新宿区,落合,歯科医院,03-7777-8888 5,F店,港区,赤坂,歯科医院,03-9876-5432 ・ ・ ・ 上記のようなデータがDBに格納されており index.htmlより ■<a href="index.php?val=shin">新宿区</a> 歌舞伎町/大久保/落合 ■<a href="index.php?val=minato">港区</a> 六本木/新橋/赤坂/西麻布/その他 このようなリンクから新宿区をクリックすると index.phpにて <新宿区の診療内容別一覧> ---------------------------- ■歌舞伎町 └<a href="index.php?val=???">内科</a>(2)//この数字は件数です └歯科医院(1) ■大久保 └歯科医院(1) ■落合 └歯科医院(1) のように表示し、さらに例えば内科をクリックすると result.phpにて B店 └03-1111-2222 C店 └03-3333-4444 と表示したいのです。 index.phpで、 $url = "localhost"; $user = "clinic"; $pass = "admin"; $db = "clinic"; // MySQLへ接続する $link = mysql_connect($url,$user,$pass) or die("MySQLへの接続に失敗しました。"); // データベースを選択する $sdb = mysql_select_db($db,$link) or die("データベースの選択に失敗しました。"); if($_GET['val'] == 'shin'){$erea = "新宿区";} if($_GET['val'] == 'minato'){$erea = "港区";} if($erea !== '') { $erea_sql = 'EREA LIKE '."'%".$erea."%'"; } else { $tempHtml = "エリア選択が不正です"; } $sql = " SELECT * FROM `clinic` WHERE {$erea_sql} "; $result = mysql_query( $sql ); //結果セットの行数を取得する $rows = mysql_num_rows($result); //表示するデータを作成 if($rows){ while($row = mysql_fetch_array($result)) { ここが全く想像すらつきません・・・(汗) } }else{ $tempHtml = "データがありません"; } //結果保持用メモリを開放する mysql_free_result($result); // MySQLへの接続を閉じる mysql_close($link) or die("MySQL切断に失敗しました。"); データの総数は、東京都内のみで1000件程度あります。 ここから先へ進むには、どこを勉強すれば良いのかすら浮かばず 非常に困っております。 ヒントでも、このページを見ろ!でも結構ですので、 何卒ご教授のほど、よろしくお願い致します。

  • PHP
  • 回答数1
  • ありがとう数2

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

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

[chiiki]ごとにくくって表示させるのですから、SQLはグループ句でくくったほうがいいでしょう。 例)条件:新宿区 SELECT chiiki,genre,count(chiiki) as cnt FROM clinic WHERE EREA LIKE '%新宿区%' GROUP BY chiiki,genre ORDER BY chiiki 例のデータでは結果はこうなるはず chiiki,genre,cnt 大久保,歯科医院,1 歌舞伎町,内科,2 歌舞伎町,歯科医院,1 落合,歯科医院,1 '-------------------------------------------------- while($row = mysql_fetch_array($result)) { //地域が前レコードと違うならば、地域名表示 if($row["chiiki"]!=$tmp_chiiki) $tempHtml.= "■".$row['chiiki']."<BR>"; //リンク付き表示 $tempHtml.= "└<a href='index.php?chiiki=???&genre=???'>".$row['chiiki']."</a>(".$row['cnt'].")<BR>"; //現レコードの地域を一時記憶 $tmp_chiiki=$row["chiiki"]; } '-------------------------------------------------- 動的にやるとval=???の引数の部分が現状だとどうしても日本語文字を使わないと無理なので、 (例)val=歌舞伎町&genre=歯科医院 できれば、chiikiテーブル、genreテーブルを別途作ったほうがいいですね。 ※urlencodeすればできないこともないです。 $tempHtml.= "└<a href="index.php?chiiki='.urlencode($row['chiiki'])."&genre=".urlencode($row['genre'])."'>".$row['chiiki']."</a>(".$row['cnt'].")<BR>"; この場合は、result.phpではurldecodeしでSQLへ組み込んでください。

kuyatake
質問者

お礼

本当にありがとうございます! いっぺんに解決してしまいました。 私の頭の中では、SQLから引っ張り出したデータを加工することばかりにとらわれて、 よもやSELECT文一発でこんな抜き出し方が出来るなんて、本当に勉強不足で恐縮です。 最後のresult.phpへのデータの渡し方は、できればurlencodeは使いたくないので、 別途新規テーブルに一時的に書き込む方法を模索してみます。 非常に助かりました。ありがとうございました。

関連するQ&A

  • PHPでMySQLのデータを検索したい

    お世話になります。 PHPでMySQLのデータを検索したいと思い、 以下のようにしてみたのですがうまく表示されません。 -- $name = $_POST["name"]; $link = mysql_connect('localhost', '', ''); $db_selected = mysql_select_db('', $link); mysql_set_charset('utf8'); $sql = "SELECT * FROM search WHERE". $name; $result = mysql_query($sql); while($row = mysql_fetch_array($name)) { print $row['name']; } $close_flag = mysql_close($link); -- どう改善すればいいのでしょうか? 初心者の為、少々お見苦しい点があるかと思いますが どうぞよろしくお願いします。

    • ベストアンサー
    • PHP
  • mysql、phpを使ってデータがあるときだけ表示させたい

    mysql、phpを使ってデータがあるときだけ表示させたい 初歩的な質問で恐縮です。 mysql、phpを使ってデータがあるときだけ、それを表示させたいと思っています。 ------------------------------------------------------------------- データベース ↓↓ name        blog      クリリン    http://www.111.jp  ヤムチャ    http://www.222.jp ブルマ ------------------------------------------------------------------- ------------------------------------------------------------------- 表示させたいこと ↓↓ クリリン  クリリン公式ブログ(リンク) ヤムチャ  ヤムチャ公式ブログ(リンク) ブルマ ------------------------------------------------------------------- ------------------------------------------------------------------- 実際にソース組んでみたやつ (何も出てこなかった。。クリリンの場合) $blog_sql = "select blog from ****"; $res = mysql_query($blog_sql); $blog = mysql_result($res,0); if ($blog > 0 ) { echo "<p><a href=\"$blog\">クリリン公式ブログ</a></p>"; } ------------------------------------------------------------------- です。 ソースの部分は若干はしょってありますが、 ifを使わないでやるとちゃんと表示されるので、細かいところは問題ないはずです。 ただ、ifを使わないとブルマの項目にも「ブルマ公式ブログ」とリンクURLが入っていない状態で出てしまうので、ブログURLが入っていないものを表示させたくない、というものです。 何かご不明な点などあればおっしゃってください! よろしくお願いします!

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

    PHPとMySQLについて PHP、MySQLともに初心者の者です。 ネットの情報を参考に以下のようなプログラムを作成しました。 <?php //ファイルを読み込み require_once("DB47.php"); // クエリを送信する $sql = "SELECT * FROM japanDB ORDER BY PREF_CD"; $result = executeQuery($sql); //結果セットの行数を取得する $rows = mysql_num_rows($result); //表示するデータを作成 if($rows){ while($row = mysql_fetch_array($result)) { $tempHtml .= "".$row["PREF_CD"]." ".$row["PREF_NAME"]." "; $tempHtml .= "\n"; } $msg = $rows."件のデータがあります。\n\n"; }else{ $msg = "データがありません。\n\n"; } //結果保持用メモリを開放する mysql_free_result($result); ?> <?= $msg ?> <?= $tempHtml ?> これはデータベースに 1、北海道 2、青森 ・  ・ ・  ・ ・  ・ 47、沖縄 といった情報を与えており、PHP側でMySQLに接続し、その内容をコマンドプロンプト上で表示するといったものです。 しかし、PHPプログラムを実行してしまうと、全データが一気に表示されてしまうので、見づらいものとなっています。 そこで、地名や番号を入力すれば、地名を表示するような検索機能を付けたいのですが、PHPからMySQLデータベース内を検索する方法が分かりません。検索機能をこのプログラムに組み込みたいのですが・・・。 どなたかご教授お願いいたします。 ***環境*** OS : Windows XP Pro PHP4.2.3 、MySQLインストール済み **********

    • ベストアンサー
    • PHP
  • php+MYSQL

    タイトル 本文 書き込み後保存を押すと 下に書き込み保存されていく形です タイトル 本文 書き込み日時 タイトル 本文 書き込み日時 エラー自体は出てないのですが書き込みが反映されません val_dunpで調べたところ resource(7) of type (mysql result) > このように出てきましたなにか文自体に必要なものがないのでしょうか? <?php $link = mysql_connect('localhost','user','pass'); if (!$link) { die('接続に失敗しました。'.mysql_error()); } $db_selected = mysql_select_db('ogawa',$link); if(!$db_selected) { die('データベース選択に失敗しました。'.mysql_error()); } $res = mysql_query('SELECT * FROM test'); if (!$res) { die('クエリーが失敗しました。'.mysql_error()); } if ( $link !==false) { $msg =''; $err_msg =''; if ( isset( $_POST['send'] )=== true) { $subject =$_POST['subject']; $honbun =$_POST['honbun']; $kakikomi = $_POST['kakikomi']; if ( $subject !=='' && $honbun !=='' && $kakikomi !=='' ) { $query = " INSERT INTO test ( " ."subject," ."honbun," ."kakikomi," .") VALUES ( " . "'" . mysql_real_escape_string( $link, $subject ) ."', " . "'" . mysql_real_escape_string( $link, $honbun )."'," . "'" . mysql_real_escape_string( $link, $kakikomi)."'," ." ) "; $kakikomi = date('Y-m-d h:i:s'); $res = mysql_query($query,$link); if ($res !==false) { $msg = '書き込みに成功しました。'; }else{ $err_msg = '書き込みに失敗しました。'; } }else{ $err_msg = 'タイトルと本文を書き込んで下さい。'; } } $query = 'SELECT id,subject,honbun,kakikomi FROM test'; $res = mysql_query($query,$link); $data = array(); var_dump($res); if ($res) { while($row = mysql_fetch_assoc($res)) { array_push($data,$row); } } arsort($data); }else{ echo"データベースの接続に失敗しました"; } mysql_close($link); ?> <html> <head> <meta http-equiv="content-type" content="text/html;charset=UTF8;" /> </head> <body>> <table border="1"> <form action="test6.php" method="POST"> <tr><th>タイトル<td><input type="text" name="text" size="50"></td></tr> <tr><th>本文<td><textarea name="subject" cols="52" rows="8"></textarea> <tr><td><input type="submit" value="保存 する" /></td><tr> </table> </form> <?php if ($msg !=='')echo'<p>'.$msg.'</p>'; if ($err_msg !=='')echo'<p style="color:#f00;">'.$err_msg.'</p>'; foreach($data as $key =>$val) { echo $val['subject'].''.$val['honbun'].''.$val['kakikomi'].'<br>'; } ?> </body> </html>

  • PHPでMySQLへの接続

    お世話になります。 phpを用いてMySQLへ接続したのですが、データが空で戻ってきました。lowは件数表示されましたし、行数もその分返ってきています。何か原因は考えられるでしょうか? <html> <head> <title>PHP TEST</title> </head> <body> <?php $link = mysql_connect('localhost', 'XXXX', 'XXXX'); if (!$link) { die('接続失敗です。'.mysql_error()); } print('<p>接続に成功しました。</p>'); $db_selected = mysql_select_db('XXXX', $link); if (!$db_selected){ die('データベース選択失敗です。'.mysql_error()); } print('<p>uriageデータベースを選択しました。</p>'); //mysql_set_charset('utf-8'); $result = mysql_query('SELECT * FROM sample'); if (!$result) { die('クエリーが失敗しました。'.mysql_error()); } while ($row = mysql_fetch_assoc($result)) { print('<p>'); print('id='.$row['str']); print(',name='.$row['etc']); print('</p>'); } $close_flag = mysql_close($link); if ($close_flag){ print('<p>切断に成功しました。</p>'); } ?> </body> </html>

    • ベストアンサー
    • PHP
  • PHPからMySQLにアクセスする方法について、

    PHPからMySQLにアクセスする方法について、 自分のとっている方法が正しいか分かりません。 現在、以下のような状態です <<< index.phpの中身(概要) >>> (1)DBのコネクト    mysql_connect("localhost", "mysql_user", "mysql_password");    mysql_select_db("mydb"); (2)DBへのアクセス    $result=mysql_query("SELECT id, name FROM mytable");    $row=mysql_fetch_array($result, MYSQL_NUM); (3)クエリーのクローズ    mysql_free_result($result); (4)exit; 公式サイトのサンプルをそのまま流用したような形なのですが、 これだとindex.phpが呼び出されるたびにDBをコネクトし直します。 現在、数万レコード単位のテーブルの読み込みが頻発するシステムを開発しています。 取得したいデータの容量自体は大きなものではなく、SELECT文も高速に動作するように WHERE文等気を使っていますが、後々のことを考えると心配になりました。 できればページが飛んでもDBの接続が保持されるようにしたいのですが 可能なのでしょうか。 また、それによってアクセスの高速化は望めるのでしょうか。 ご存知の方、お手数ですがご教授お願いいたします。

    • ベストアンサー
    • PHP
  • PHP+MySQLを実行するとエラーが出てパソコンがフリーズする。

    次のphpを実行すると、求めるデータは表示出来ますが、その下に引き続き Warnning:mysql_result()[function.mysql_result]: Unable to jump to row 7 on MySQL result index 3 in C:****test.php on line 10; 同文で on line 11; 以下,Unable to jump toの 「 row 7」 が row 8 row 9・・・・・・ と延々と続き、パソコンがフリーズしてしまいます。 実行したphp文。 <?php $con=mysql_connect(localhost,"root","root"); $selectdb=mysql_select_db("sales",$con); $sql="select * from sample"; $result=mysql_query($sql,$con); $row=mysql_fetch_array($result); $price=mysql_result($result,$i,1); $volume=mysql_result($result,$i,2); echo("$price:$volume<br>\n"); mysql_close($con); ?> 参考書を調べて、いろいろ変えてみましたが、分かりません。 幼稚なphp文で恐縮ですが、悪いところをご指摘頂ければ有難いです。

    • ベストアンサー
    • PHP
  • MySQLをPHPで使おうとして

    FedoraCore(192.168.0.101)に /var/www/html/index.php: <?php $link=mysql_connect("localhost","root","12") or die("Could not connect"); print"Connected successfully"; mysql_close($link); ?> を入れて他のPC(192.168.0.100)からこれを呼びましたが Warning: mysql_connect(): Can't connect to local MySQL server through socket '/var/lib/mysql/mysql.sock' (2) in /var/www/html/index.php on line 2 Could not connect となり接続できません /var/lib/mysql/はありmysql.sockがありません どうしたらいいのでしょうか?

    • ベストアンサー
    • MySQL
  • PHPとMySQLで100万件のデータを登録

    PHPとMySQLで100万件のデータを登録する方法に困っております。 1.PHPで100万回ループして数字をランダムで取得し一意の数字を配列に格納。 ⇒データ量が多すぎてタイムアウトしてしまいます。いい方法はありますか? while($i<1000000){ $h = sprintf("%07d",mt_rand(1,1000000)); if(!array_search($h,$val)){      array_push($val,$h);      $i++; } } 2.またデータベースはMySQLを使用しようかと考えていますが、一気に登録する方法など効率のいいやり方はありますでしょうか?

    • ベストアンサー
    • PHP
  • PHPサイトからMySQL内のデータを知る方法

    質問失礼いたします。 MySQLにあるデータベースをPHPサイトに表示しています。 PHPでは、 【datab.php】で、データベースへ接続し $link = mysql_connect('localhost', 'user', 'pass'); 【hyouji.php】にて、データを表示しています require_once("datab.php"); //SQL文 mysql_close($link); //データ配列 MySQL内のカラムには name , add , memo の3つがあり、PHPに表示させているのは name , add のみです。 しかし、どうやら memo にある内容が閲覧している人にわかったらしいのですが、 どこを見ても、memoの内容は表示されていません。 すみません、うまく言えないのですが… 上記にある【datab.php】の接続方法では、 MySQL内のデータがバレてしまうのでしょうか…? 原因も分からないのですが、何がお知恵をいただけたらと思います。 宜しくお願い致します。

    • ベストアンサー
    • MySQL

専門家に質問してみよう