PHPで同じDBから違う内容でカウントを繰り返す方法とは?

このQ&Aのポイント
  • PHPで同じデータベースから異なる内容でカウントを繰り返す方法について知りたいです。
  • 現在、各クラスの田中・鈴木・佐藤の人数をMySQLのデータベースからカウントし、HTMLのテーブルで表示しています。
  • しかし、カウント用のPHPコードが非常に長くなってしまっています。よりスマートな方法はありますか?
回答を見る
  • ベストアンサー

PHPで同じDBから違う内容でカウントを繰り返す

各クラスに、田中・鈴木・佐藤が何人いるかMySQLのデータベースからカウントし HTMLでテーブルを組んで、それぞれの人数を表示しています。 【カウント用PHP】 $cnt_A = "SELECT COUNT(*) AS cnt FROM table WHERE name LIKE '%田中%' AND class LIKE '%1組%'"; $cnt_recordSet_A = mysql_query($cnt_A); $table_A = mysql_fetch_assoc($cnt_recordSet_A); $A = number_format($table_A['cnt_A']); $cnt_B = "SELECT COUNT(*) AS cnt FROM table WHERE name LIKE '%鈴木%' AND class LIKE '%1組%'"; $cnt_recordSet_B = mysql_query($cnt_B); $table_B = mysql_fetch_Bssoc($cnt_recordSet_B); $B = number_format($table_B['cnt_B']); $cnt_C = "SELECT COUNT(*) AS cnt FROM table WHERE name LIKE '%佐藤%' AND class LIKE '%1組%'"; $cnt_recordSet_C = mysql_query($cnt_C); $table_C = mysql_fetch_Cssoc($cnt_recordSet_C); $C = number_format($table_C['cnt_C']); $cnt_D = "SELECT COUNT(*) AS cnt FROM table WHERE name LIKE '%田中%' AND class LIKE '%2組%'"; $cnt_recordSet_D = mysql_query($cnt_D); $table_D = mysql_fetch_Dssoc($cnt_recordSet_D); $D = number_format($table_D['cnt_D']); $cnt_E = "SELECT COUNT(*) AS cnt FROM table WHERE name LIKE '%鈴木%' AND class LIKE '%2組%'"; $cnt_recordSet_E = mysql_query($cnt_E); $table_E = mysql_fetch_Essoc($cnt_recordSet_E); $E = number_format($table_E['cnt_E']); $cnt_F = "SELECT COUNT(*) AS cnt FROM table WHERE name LIKE '%佐藤%' AND class LIKE '%2組%'"; $cnt_recordSet_F = mysql_query($cnt_F); $table_F = mysql_fetch_Fssoc($cnt_recordSet_F); $F = number_format($table_F['cnt_F']); 【表示用PHP】 +------+-----------------+-------------------+ |----|1組          |2組           | +------+-----------------+-------------------+ |田中|<?PHP print $A ?>人|<?PHP print $D ?>人| +------+-----------------+-------------------+ |鈴木|<?PHP print $B ?>人|<?PHP print $E ?>人| +------+-----------------+-------------------+ |佐藤|<?PHP print $C ?>人|<?PHP print $F ?>人| +------+-----------------+-------------------+         (テーブルはHTMLで作成、コードは略します・・・) 今後、各テーブルにさらに  ・男子の人数/女子の人数 表示例: +------+---------------------------------------------------------------------+...... |田中|<?PHP print $A ?>人(男子:<?PHP print $A_boy ?>/女子:<?PHP print $A_girl ?>)|...... +------+---------------------------------------------------------------------+...... というように増やしていこう思ったのですが、 【カウント用PHP】がすごく長くなってしまって、スマートじゃないのではないかと疑問に思っています。 簡潔なやり方などご存じの方いましたらご教授お願い致します。

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

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

  • ベストアンサー
  • hogya
  • ベストアンサー率67% (49/73)
回答No.1

以下のようにUNION(読みはユニオンです。ウニオンではありません)でデータの取得を1回で済ませて表示の部分の記述を1箇所にする。という方法はあるかも知れません。 (SELECT '田中' AS 氏名, (SELECT COUNT(*) FROM table WHERE name LIKE '%田中%' AND class LIKE '%1組%') AS 1組, (SELECT COUNT(*) FROM table WHERE name LIKE '%田中%' AND class LIKE '%2組%') AS 2組) UNION ALL (SELECT '鈴木' AS 氏名, (SELECT COUNT(*) FROM table WHERE name LIKE '%鈴木%' AND class LIKE '%1組%') AS 1組, (SELECT COUNT(*) FROM table WHERE name LIKE '%鈴木%' AND class LIKE '%2組%') AS 2組)

rabbit-kimura
質問者

お礼

ありがとうございました!!

その他の回答 (1)

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

こんな風にテンポラリテーブルを使ってやるといいです ちなみに'%田中%'だと大田中とかひっかかりますがいいですか? //準備 create table hoge (id int,name varchar(20),class varchar(20)); insert into hoge values(1,'田中A','1組'),(2,'田中B','1組'),(3,'田中C','2組'),(4,'大田中A','1組'),(5,'佐藤A','2組'),(6,'佐藤B','2組'),(7,'佐藤C','2組'),(8,'鈴木A','1組'),(9,'鈴木B','1組'),(10,'鈴木C','1組'); //ここから create temporary table fuga(name varchar(20)); insert into fuga values('田中'),('佐藤'),('鈴木'),('高橋'); select fuga.name,sum(class like '%1組%') AS 1組,sum(class like '%2組%') AS 2組 from fuga left join hoge on hoge.name like concat('%',fuga.name,'%') group by name

rabbit-kimura
質問者

お礼

≫ちなみに'%田中%'だと大田中とかひっかかりますがいいですか? お、おおぅ!!確かに!! その辺も考慮して使います!! 回答ありがとうございました!!

関連するQ&A

  • PHPで同じページに似た内容のデータベースを表示

    PHPで同じページに同じデータベース(table)から別の条件でリストを表示させています。 もっと簡単でスマートな方法はないか、ご質問させていただきます。 【表示例】 <鈴木さん> 鈴木たろう 090-0000-0000 鈴木まさゆき 080-0000-0000 鈴木あきこ 03-0000-0000 <佐藤さん> 佐藤まさる 090-0000-0000 佐藤ともみ 080-0000-0000 佐藤けいこ 03-0000-0000 【PHP】 <?PHP $sql = "SELECT name, tel FROM table"; $sql .= " WHERE name LIKE '%鈴木%'"; $recordSet = mysql_query($sql); $rows = mysql_num_rows($recordSet); if($rows){ while($row = mysql_fetch_array($recordSet)) { $table .= "".$row['name'].""; $table .= " ".$row['tel']."<br>"; $table .= "\n"; } } echo "<鈴木さん><br>"; echo $table; mysql_free_result($recordSet); ?> <?PHP $sato_sql = "SELECT name, tel FROM table"; $sato_sql .= " WHERE name LIKE '%佐藤%'"; $sato_recordSet = mysql_query($sato_sql); $sato_rows = mysql_num_rows($sato_recordSet); if($sato_rows){ while($sato_row = mysql_fetch_array($sato_recordSet)) { $sato_table .= "".$sato_row['name'].""; $sato_table .= " ".$sato_row['tel']."<br>"; $sato_table .= "\n"; } } echo "<佐藤さん><br>"; echo $sato_table; mysql_free_result($sato_recordSet); ?> 上記のように、同じデータベース(table)から、 「鈴木さん」「佐藤さん」それぞれ条件を設定して表示していますが、 もっと簡単に短いコードで表示させることは可能でしょうか。 また、可能であれば、それを何と呼べば(検索すれば)宜しいのでしょうか。 お願い致します。

    • ベストアンサー
    • PHP
  • PHP,MYSQLで特定例を表示する場合、

    PHP、MYSQLで特定例を表示する場合のsql文が分かりません。 データーベースmeibo no | name | sex | age | 1 | 一郎 | 男 | 20 | 2 | 一子 | 女 | 22 | 3 | 二郎 | 男 | 25 | 4 | 二子 | 女 | 27 | 女のみを表示したい場合を考え以下のようなコードを作りましたが上手くいきません。 <?php //データーベース接続 require_once('../require/dbcon.php'); //件数の表示 $recordSet = mysql_query('SELECT COUNT(sex) AS record_count FROM meibo WHERE sex(女)'); $data = mysql_fetch_assoc($recordSet); echo '<b>','※ 女性メンバー','</b> ('.$data['record_count'].' 人のデーターがあります。)<br /><br />'; //テーブルセット $recordSet = mysql_query('SELECT sex FROM meibo WHERE sex(女)'); while ($table = mysql_fetch_assoc($recordSet)) { echo $table['no']; echo $table['name']; echo $table['age']; } エラーでは $data = mysql_fetch_assoc($recordSet); と、 while ($table = mysql_fetch_assoc($recordSet)) のラインが出るのですが 何が悪いのか良く分かりません。 私の考えではsql文が悪いのではないかと思うのですが、どなたかお教えくださいませ。

    • ベストアンサー
    • PHP
  • DBから取得した内容を横表示

    質問します。 DBにID,NAME,IMGと言うカラム名があります。 例 ID NAME IMG 0001 PHP1 PHP1 0002 PHP2 PHP2 0003 PHP3 PHP3 データを取得し、ブラウザにて横に表示するように したいのですが、うまくいきません…。 ブラウザーイメージ 0001 0002 0003 PHP1 PHP2 PHP3 画像 画像 画像 以下がサンプルです。 <?php //DB接続 if((!$db = mysql_connect("","",""))){ die; } //DB選択 if((!mysql_select_db(""))){ die; } if(!mysql_query('set names sjis')){ echo "sjis 設定エラー"; die; } $SQL = "SELECT * FROM video_data"; if(!($rs = mysql_query($SQL))){ print mysql_error(); die; } ?> <table border="0"> <TR> <?php $count = 0;      while($item = mysql_fetch_array($rs)){ //ID表示 print "<TD>".$item['ID']."</TD>"; //名前表示 print "<TD>".$item['NAME']."</TD>"; //改行     if($count == 4){       print "</TR>";   $count = 0;     }     //IMG表示 print "<TD><img src='./test/".$item['ID'].".jpg'/></TD>"; $count++; } print "<TR>"; //コネクションクローズ mysql_close(); ?> </TABLE> どこを修正したらいいのかわかりません… 色々やっているんですが…。 わかる方が居たらヒントでもいいので 教えて下さい。よろしくお願いします。

    • ベストアンサー
    • PHP
  • phpのエラーについてです

    mysql上のデータをphpでブラウザに表示するコードを書いています。 下記のプログラムを実行した所 Warning: mysql_fetch_assoc() expects parameter 1 to be resource, boolean given in C:\xampplite\htdocs\shop\index.php on line 18 というようなエラーが表示されます。 本の通りに進めているので間違っていないはずなんですが・・ どこが成立していないのでしょうか??? <?php mysql_connect('localhost', 'root', '') or die(mysql_error()); mysql_select_db('mydb'); mysql_query('SET NAMES UTF8'); $recordSet = mysql_query('SELECT m.name, i.* FROM makers m, my_ items i WHERE m.id=i.maker_id ORDER BY id DESC'); ?> <table width="100%"> <tr> <th scope="col">ID</th> <th scope="col">メーカー</th> <th scope="col">商品名</th> <th scope="col">価格</th> </tr> <?php while ($table = mysql_fetch_assoc($recordSet)) { ?> <tr> <td><?php print(htmlspecialchars($table['id'])); ?></tb> <td><?php print(htmlspecialchars($table['name'])); ?></tb> <td><?php print(htmlspecialchars($table['item'])); ?></tb> <td><?php print(htmlspecialchars($table['price'])); ?></tb> </tr> <?php } ?> </table>

    • ベストアンサー
    • PHP
  • カウントして抽出するsqlをまとめたい

    mysql初心者です。宜しくお願い致します。 PHP+Mysqlで以下のスクリプトを組んでいます。 変数aを一旦決めておき、カウント結果次第で変数aの値を広げるというものです。 これをSQL文一発にまとめたいのですが、可能でしょうか? mysqlのバージョンは5.1.34です。お詳しい方、ご教授お願い致します。 $a = 10; //仮に10 $query = "SELECT COUNT(*) AS cnt FROM mydb WHERE col_a BETWEEN ( 100 - $a ) AND ( 100 + $a ) AND col_b BETWEEN ( 100 - $a ) AND ( 100 + $a )"; $result = mysql_query($query); $row = mysql_fetch_array($result); if($row[cnt] < 10){$a = 20;} //件数が10件以下ならaの範囲を広げて結果取得 $query = "SELECT * FROM mydb WHERE col_a BETWEEN ( 100 - $a ) AND ( 100 + $a ) AND col_b BETWEEN ( 100 - $a ) AND ( 100 + $a )"; $result = mysql_query($query);

    • ベストアンサー
    • MySQL
  • PHP+MySQL テーブルが表示されない

    下記のように、MySQLのデータをPHPでテーブル形式で表示しています。 【PHP部分】 $check_sql = "SELECT * FROM table WHERE ( check1 LIKE '%東京%' OR check2 LIKE '%品川%' OR check3 LIKE '%%' ) AND hinichi > NOW( )"; $check_recordSet = mysql_query($check_sql); $check_rows = mysql_num_rows($check_recordSet); if($check_rows){ while($check_row = mysql_fetch_array($check_recordSet)) { $checktable = "<tr>"; $checktable .= "<td>".$check_row["check1"]."</td><td>".$check_row["check2"].$check_row["check3"]."</td>"; $checktable .= "</tr>\n"; } $msg = $check_rows."件みつかりました"; } 【HTML部分】 <?= $msg ?> <table> <?= $checktable ?> </table> $checktable が表示されないのですが、 どうも間違えている箇所がわかりません。 $msgは表示されます。 また、$check_sqlは、PHPMyAdmin上で試していますが、エラーは出ておりません。 ご存じの方いらっしゃいましたら、ご教授お願い致します。

    • ベストアンサー
    • PHP
  • phpでDBを検索したい

    最近PHP+mysqlの勉強を始めて、入門書片手に試行錯誤している状況です。 phpで検索ボックスを作って、データベースから名前を引っ張ってきたいのですが、うまくいきません… 因みに同じページに表示したいと思っています。 あと、多分使っている関数が古いとは思いますが、PDOやmysqliとかにすると今より更に知識不足でエラーになってしまうので、とりあえず古いままで使っていますが気にしないでください… データベース名:mydb テーブル名:table id | name | ---+------------+-- 1 | 名前太郎 | 2 | 氏名太郎 | 3 | 名字一郎 | 4 | 名前五郎 | 5 | 氏名花子 | こういうテーブルがあったとして、 名前 というキーワードで検索したときに、セレクトボックスに 名前太郎と名前五郎の2つが表示できたらと思っています。 根本的に間違っているのかもしれませんが、どのように変えればいいのかご教示いただけると幸いです。 何卒よろしくお願い致します。 <?php ちょっとした別の処理~省略 print <<<_FORM_ <label for="name_search">名前検索</label> <form action="" method="post"> <input name="u_name" type="text" id="u_namae" value="" /> <input type="submit"> </form> _FORM_; if (isset($_POST['u_name'])){ $kensaku = htmlspecialchars($_POST['u_name']); $kensaku = "'%". $kensaku ."%'"; require_once('dbconnect.php'); $sql = sprintf("SELECT * FROM table WHERE name LIKE $kensaku "); $recordSet = mysql_query($sql); print <<<_FORM_ <select name="u_name"> _FORM_; while ($kekka = mysql_fetch_assoc($recordSet)) { $val=htmlspecialchars($kekka['name']); ?> <option value="<?php print(htmlspecialchars($kekka['id'])); ?>"> <?php print(htmlspecialchars($kekka['name'])); ?> </option> <?php } print <<<_FORM_ </select> _FORM_; } ?>

    • 締切済み
    • PHP
  • PHPからのLike検索について。

    初めまして。 ロリポップでPHPとMySQLを使ってHPを作成しているのですが Likeの条件を付け足すと結果が取得できなくなってしまいます。 ロリポップ上の【phpMyAdmin】で同じSQLを実行すると 結果を取得してくれるのですが PHP上でLike条件を付け足すと、上手く結果を取得してくれなくて困っています。 $key = "あ"; $LIKE = " where furigana Like '$key%'"; $SQL = "select count(*) from item_info" . $LIKE; $rst = mysql_query( $SQL, $con ); print $SQL; $col = @mysql_fetch_row($rst); $ret[0] = mb_convert_encoding($col[0],"SJIS","EUC-JP"); print "<br>"; print $ret[0]; このSQLで結果【1】が取得できるはずなのですが 表示すると必ず【0】となってしまいます。。 上記のコードに何か間違いがありますでしょうか? ご教授お願い致します。

    • 締切済み
    • PHP
  • PHP テーブルに表示した複数データを配列でもって、DBにupdateするのができない

    かなり困っています。(T_T) 作ろうと思っているのは、 まず、Mysqlより取得した複数データをテーブルに表示します。 その取得したデータの一部を修正し、「変更」ボタンを押すと、その修正したデータをMysqlにアップロードするという機能を作りたいと思っています。 問題なのが、Mysqlよりデータを取得し、テーブルに表示まではできたのですが、修正したデータを配列で取得する処理ができません。 テーブルには修正した複数データ(例:3項目の5データ)があり、そのデータをどのように変数に格納するのか(多分配列で持たないとダメなのかなぁ?)がわかりません。 変数に格納さえできれば、SQL:update文でMysqlに反映はできると思うのですが。。。その前段階ができていません。 ちなみに、作成ソースは。。。。 ****************** PHP部分 ********************** <?php ・・・・・(省略) // 「変更」ボタン押した時 if (isset($_POST['btnshopchg'])) { $cnt2 = 0; while ($cnt2 < $_SESSION[cnt1]) { $knrira = $_POST['kanrichg']['$cnt2'][0]; $knrino = $_POST['kanrichg']['$cnt2'][1]; $knrists = $_POST['kanrichg']['$cnt2'][2]; $knrisdate = $_POST['kanrichg']['$cnt2'][3]. " 00:00:00"; $shopid = $_SESSION['shop_id'][$cnt2]; $sql = " update shopping set sendnumber = '" .mysql_real_escape_string($knrino). "', state = '" .mysql_real_escape_string($knrists). "', shopping_date = '" .mysql_real_escape_string($knrisdate). "' where shopping_id = '" .mysql_real_escape_string($shopid). "'"; $result = mysql_query($sql); $cnt2 = $cnt2 + 1; } $error_message = '変更しました。。。'; ・・・・・・・(省略) ?> ****************** HTML部分 ********************** ・・・・・・・(省略) <table border="1"> <tr><th>変更</th> <th>注文ID</th><th>注文日時</th><th>商品名</th> <th>個数</th><th>送り状No</th><th>状態</th><th>発送日時</th> </tr> <?php $cnt1 = 0; while ($shopping = mysql_fetch_array($result)){ ?> <tr> <td class="knrchg"><input type="radio" name="kanrichg['<?php print $cnt1; ?>'][]" value="1"></td> <td class="knrno"><?php print $shopping['shopping_id']; ?></td> <td class="knrtime"><?php print date('Y/m/d', strtotime($shopping['order_date'])); ?></td> <td class="knrname"><?php print $shopping_name_tbl[$shopping['item_id']]; ?></td> <td class="knrnum"><?php print $shopping['quantity']; ?></td> <td class="knrsno"><input type="text" name="kanrichg['<?php print $cnt1; ?>'][]" value="<?php print $shopping['sendnumber']; ?>" size="16"></td> <td class="knrsts"><input type="text" name="kanrichg['<?php print $cnt1; ?>'][]" value="<?php print $shopping['state']; ?>" size="4"></td> <td class="knrout"><input type="text" name="kanrichg['<?php print $cnt1; ?>'][]" value=" <?php if($shopping['shopping_date'] != '1970-01-01 00:00:00'){ print date( 'Y/m/d', strtotime($shopping['shopping_date'])); } else { print '-'; } ?>" size="16"></td></tr> <?php $_SESSION['shop_id'][$cnt1] = $shopping['shopping_id']; $cnt1 = $cnt1 + 1; $_SESSION[cnt1] = $cnt1; } ?> </table> ・・・・・・・(省略) という感じです。。。 全くわかりません。PHPの配列(array)の理解が不十分なのだと思います。 どなたかわかる方、解決方法を教えてください。。。 よろしくお願いします。

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

    PHP初心者です PHP 5.2.5 MySQL 5.1.22 レンタルサーバーのphpのバージョンが php5.2.5ではpdoがバグで使えないらしいのでmysqliを使おうとしています。PHP 5.2.5でもmysqliはバグありますか? mysqliでMYSQLに接続するにはどうすればいいのでしょうか? いままではこんな感じでしたがmysqliにするとどんなコードになるのでしょうか? $link=mysql_connect('localhost', 'user', 'pass')or die(mysql_error()); mysql_select_db(user'); mysql_query('SET NAMES UTF8'); $start=1; $hyouji=10; $recordSet = mysql_query(sprintf('SELECT * FROM hoge2 ORDER BY id LIMIT %d, %d' , ',$start,$hyouji)); <?php while ($table = mysql_fetch_assoc($recordSet)) { ?> <tr> <td><?php print($table['id']); ?></td> <td><?php print($table['name']); ?></td> </tr> <?php } ?>

    • ベストアンサー
    • PHP

専門家に質問してみよう