• ベストアンサー

forで書き出した値を条件付で合計したい

PHPファイルで、以下のような成績表が出力されます。 ------------ 国語  算数 ------------ 89   NULL 90   78 NULL  45 60   99   :略 ------------- 150  177 ←こういう風に合計行を付けたしたいのですが、 事情があり、国語も算数も受験した者だけを合計したいのです。 for文とかmysql_fetch_arraytとか、使ってる関係で、 どういうにすればよいのかさっぱり見当つきません。 記述につき、アドバイスいただけますと幸いです。 <?php $con = mysql_connect(SERV, USR, PASS); $selectdb = mysql_select_db(MYDV, $con); $sql = "SELECT KOKUGO,SANSU FROM MYTABLE"; $rst = mysql_query($sql, $con); $recmax = mysql_num_rows($rst); $body .= "<table border='1'>\n"; for ($recnum = 0; $recnum < $recmax; $recnum++) { $col = mysql_fetch_array($rst); $body .= "<tr>\n"; $body .= "<td>" . $col["KOKUGO"] . "</td>\n"; $body .= "<td>" . $col["SANSU"] . "</td>\n"; $body .= "</tr>\n"; } $body .= "</table><br>\n"; mysql_free_result($rst); $con = mysql_close($con); ?> <html><body> <?= $body ?> </body></html> ■ 環境 PHP 5.0.4 Win MySQL mysql 4.0.14b Win ■知識レベル: HTMLタグ打ち、初歩的なSQLを理解できる程度、PHP他プログラミング知識ほとんどなし

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

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

  • ベストアンサー
  • awazak
  • ベストアンサー率36% (61/165)
回答No.2

それは、「where」で条件指定をしてあげます。 SELECT sum(KOKUGO),sum(SANSU) FROM MYTABLE where KOKUGO<>'NULL' && SANSU<>'NULL'; ですね。

litton101
質問者

補足

awazakさん、アドバイスありがとうございました。 目からうろこです。なるほど。 where KOKUGO<>'NULL' && SANSU<>'NULL'; すみません、追加で、ゼロ点もWHEREでハネたいのですが、 その場合の記述はどうなりますでしょうか・・・

その他の回答 (4)

  • BLUEPIXY
  • ベストアンサー率50% (3003/5914)
回答No.5

別にSQLを発行するのも1つの方法だと思いますが、 $KOKUGO_SUM=0; $SANSU_SUM=0; としておいて for ($recnum = 0; $recnum < $recmax; $recnum++) { のループの中で if($col[["KOKUGO"] != NULL && $col["SANSU"] != NULL){ $KOKUGO_SUM+=$col[["KOKUGO"]; $SANSU_SUM+=$col["SANSU"]; } とかすればいいのではないかと思います。(ついでだし) 実際に試してみたわけではないので間違っていたらすみません

litton101
質問者

お礼

BLUEPIXYさん、いつもお世話になっております。 SQL発行による解決策は、発想だけは思いついていたのですが、 実はご教示のようなPHPにコードによる解決策を模索していました。 こういうの、PHPで解決できないのかなぁ?と。 試してみたのですが、バッチリです(「[[」のタイプミスだけ修正) 本番環境には平均や分散も出したいので、#1さん~#4さんがご提示された SQLを使うと思いますが、今後の参考にさせていただきます。 ありがとうございました。

回答No.4

>ゼロ点もWHEREでハネたいのですが、 >その場合の記述はどうなりますでしょうか・・・ 自分はNo2さんではありませんが SELECT SUM(KOKUGO),SUM(SANSU) FROM MYTABLE WHERE (KOKUGO<>'NULL' OR KOKUGO<>'0') AND (SANSU<>'NULL' OR SANSU<>'0'); これはNULL=0としての条件で書いていますのでご了承を。

litton101
質問者

お礼

yamadachanさん、補足ありがとうございました。 完全に理解できました、なるほど、そういうことですね。 ありがとうございました。

  • php504
  • ベストアンサー率42% (926/2160)
回答No.3

>すみません、追加で、ゼロ点もWHEREでハネたいのですが、 >その場合の記述はどうなりますでしょうか・・・ 両方とも点数があるもの(0より大きい)を選択すればいいと思います。 0もNULLも除かれます。

litton101
質問者

お礼

php504さん、御礼遅くなってすみませんでした。 なるほど、> 0 とすればいいわけですね。 大変参考になりました。

  • brax3
  • ベストアンサー率36% (17/47)
回答No.1

SELECT SUM(NVLKOKUGO),SUM(SANSU) FROM MYTABLE の結果を出力すればよいのではないでしょうか

litton101
質問者

お礼

早速のレスありがとうございました。 わたしも当初はそのように考えたのですが、 「国語も算数も受験した者だけを合計」となると ご提示のものでは解決しませんよね? ここでは例示したものですと、国語=150、算数=177となるのが正解です。 ------------ 国語  算数 ------------ 89   NULL←合計対象外 90   78  ←合計対象 NULL 45  ←合計対象外 60   99  ←合計対象 ------------- 150  177

関連するQ&A

  • SQL1回で、平均と合計を両方出す方法はありますか?

    1回のSQL文発行で、同じフィールドに対し平均(AVG)と合計(SUM)を 両方算出することはできませんよね? 以下のようにすると、「第一列」が空白で出力されてしまいます。 $sql = "SELECT AVG(MYDATA) AS AVG_MYDATA, SUM(MYDATA) AS SUM_MYDATA FROM MYTABLE"; $rst = mysql_query($sql, $con); $recmax = mysql_num_rows($rst); for ($recnum = 0; $recnum < $recmax; $recnum++) { $col = mysql_fetch_array($rst); $body = "<table border='1'>"; $body .= "<tr>"; $body .= "<td>" . $col["AVG_NYDATA"] . "</td>"; //第一列 $body .= "<td>" . $col["AVG_NYDATA"] . "</td>"; //第二列 $body .= "</tr>"; $body = "</table>"; 環境:MySQL 4.0.25

    • ベストアンサー
    • MySQL
  • (超初歩)配列関数arrayの書き方について…

    Sansu(算数)、Kokugo(国語)に、それぞれ、90、80…略、87、96、76…略 のようにテストの点が登録されてて、これを次のような形で取り出すとします。 $sql .= "SELECT * FROM MYTABLE"; $rst = mysql_query($sql, $con); $recmax = mysql_num_rows($rst); for ($recnum = 0; $recnum < $recmax; $recnum++) {   $col = mysql_fetch_array($rst);   echo $col["Sansu"];   echo $col["Kokugo"]; } この、算数と国語を、次のような形にするには、どう書けばいいでしょうか? $Sansu_X = array(90, 80・・・略); $Kokugo_Y = array(87、96、76…略); 要は、JpGraphで、算数=X軸と国語=Y軸とすつ散布図を描かせたいのですが、 mysql_fetch_arrayで取り出した値を、下記の 「$datax = array(3.5・・・」、「$datay = array(20,22,・・・」のように したいのです。 <?php include ("../jpgraph.php"); include ("../jpgraph_scatter.php"); $datax = array(3.5,3.7,3,4,6.2,6,3.5,8,14,8,11.1,13.7); $datay = array(20,22,12,13,17,20,16,19,30,31,40,43); $graph = new Graph(300,200,"auto"); $graph->SetScale("linlin"); $graph->img->SetMargin(40,40,40,40); $graph->SetShadow(); $graph->title->Set("A simple scatter plot"); $graph->title->SetFont(FF_FONT1,FS_BOLD); $sp1 = new ScatterPlot($datay,$datax); $graph->Add($sp1); $graph->Stroke(); ?>

    • ベストアンサー
    • PHP
  • 検索結果の表示をもっと早くしたい

    次のように、200人の「MYID」諸氏に対応する登録年月(6桁)を リストアップしたところ、SQLを人数分解釈するためか、 表示までに異常に時間がかかってしまうのですが、 改善案をご教示いただけますと幸いです。 リストアップのイメージ (1001氏) 200409 200410 200411 (1002氏) 200501 200402   :(略) <?php $con = mysql_connect(SERV, USR, PASS); $selectdb = mysql_select_db(MYDV, $con); $numfrom = "1001"; $numto = "1200"; for ($i = $numfrom ; $i <= $numto; $i++) { $sql = "SELECT * FROM MYTABLE"; $sql .= "WHERE MYID = " . $i; $rst = mysql_query($sql, $con); $recmax = mysql_num_rows($rst); $body .= "<table border='1'>\n"; for ($recnum = 0; $recnum < $recmax; $recnum++) { $col = mysql_fetch_array($rst); $body .= "<tr>\n"; $body .= "<td>" . $col["YYMM"] . "</td>\n"; $body .= "</tr>\n"; } $body .= "</table><br>\n"; } mysql_free_result($rst); $con = mysql_close($con); ?> <html><body> <?= $body ?> </body></html>

    • ベストアンサー
    • PHP
  • 入門書のPHPサンプル内で、MySQL関数を使いたい

    環境:PHP5.0.3+MySQL4.0.14です。PHPどころか、プログラムも素人です。 検索結果をHTML表に一覧化する仕組みを作っているのですが WHERE条件に合致した数値データを平均化したり、 WHERE条件合致した日付データの書式を【MySQL関数によって】加工したいです。 それぞれ、mysql.exe(DOS窓上)での書き方はわかったものの (SELECT AVG(HOGE1) WHERE (HOGE <= 1) のように)、 これをPHPに組み込んだ際ににどう使えばわからないです。 今回使っているPHP入門書のサンプルは以下の通りです。ここで mysql_fetch_arrayに格納されたテーブル(カラム)を取り出しているらしい ことはわかりますが、以下のサンプルで加工したい対象である $col["DATE1"]、$col["HOGE1"]を $col["date_format(DATE1, '%y/%m/%d')"] や $col["AVG(HOGE1)"]などと してもだめみたいです。 以下の例で、これらを取り出すにはどのように記述したらいいでしょうか。 よろしくお願い致します。 <?php require_once("dbini.php"); $con = mysql_connect($DBSERVER, $DBUSER, $DBPASSWORD); $selectdb = mysql_select_db($DBNAME, $con); $sql = "select * from mytable"; $rst = mysql_query($sql, $con); $recmax = mysql_num_rows($rst); $body = "結果: $recmax 件"; $body .= "<table>"; for ($recnum = 0; $recnum < $recmax; $recnum++) { $col = mysql_fetch_array($rst); $body .= "<td>" . $col["DATE1"] . "</td>"; $body .= "<td>" . $col["HOGE1"] . "</td>"; $body .= "</tr>"; } $body .= "</table>\n"; mysql_free_result($rst); $con = mysql_close($con); ?> <html> <head></head> <body> <?= $body ?> </body> </html>

    • ベストアンサー
    • PHP
  • mysql_num_rowsなどのWarningの原因がわからない

    以下のプログラム、何が誤っているのでしょうか。 違う箇所で使ったPHPの使いまわし(そちらは問題なく動いている) なのですが、サーバー上で実行しても Warning: mysql_num_rows(): supplied argument is not a valid MySQL result ... Warning: mysql_free_result(): (以下同上) となり、どうしても原因が究明できません。。 以下、省略してますが、本質は変わりません。SQL文($sql)を phpMyAdminで通すとなんら問題なく問い合わせ結果が得られます。 <?php  $con = mysql_connect(localhost, username, pss);  $selectdb = mysql_select_db(mydb, $con);  $sql = "SELECT Kaisya FROM MYTABLE";  $rst = mysql_query($sql, $con);  $recmax = mysql_num_rows($rst);//■←この行がWarning■  $body = "<table border='1'>";  $body .= "<tr>";  $body .= "<td style=\"text-align: center;\">会社名</td>";  for ($recnum = 0; $recnum < $recmax; $recnum++) {   $col = mysql_fetch_array($rst);   $body .= "<tr>";   $body .= "<td>" . $col['Kaisya'] . "</td>";   $body .= "</tr>";  }  $body .= "</table>";  mysql_free_result($rst);//■←この行がWarning■  $con = mysql_close($con); ?> <html><head></head><body> <?= $body ?> </body></html>

    • ベストアンサー
    • PHP
  • リストから詳細画面に遷移するためのリンク作成と詳細画面の表示

    PHP5とMySQL4.0の組み合わせで、初歩的なことがわかりません。 例えば、(1)社員IDと、(2)年齢、(3)名前をリストアップする画面があるとして、 IDのところをハイパーリンクにして、それを押すとその社員の レコード内容を更新する画面を出す、みたいなことをしたいのですが、 これって method="POST" でなく、GETでやるのですよね? 「IDのリンク」とは、<a href="syain_detail.php?id=100">みたいなカタチに なるのでしょうが、具体的なスクリプトでご教示いただけないでしょうか。 単純に(IDへのリンクを考えずに)DBのレコードをPOSTでざーっと リストアップするHTMLまではできるのですが、 IDをハイパーリンクにして次の画面を構成するPHPがさっぱり わからないのです。下記、DBのサンプルと、わたしにわかるスクリプトです。 --------syainmaster---------- id   age  name ---------------------- 100   20   suzuki 200   24   sato 300   30   tanaka ----------------------- <?php   $con = mysql_connect(localhost, root, mypass);   $selectdb = mysql_select_db(mydb, $con);   $sql = "select * from syainmaster";   $rst = mysql_query($sql, $con);   $recmax = mysql_num_rows($rst);   $body = "<TABLE>";   for ($recnum = 0; $recnum < $recmax; $recnum++) {     $col = mysql_fetch_array($rst);     $body .= "<TR>";     $body .= "<TD>" . $col["id"] . "</TD>";     $body .= "<TD>" . $col["age"] . "</TD>";     $body .= "<TD>" . $col["name"] . "</TD>";     $body .= "</TR>";   }   $body .= "</TABLE>";   $con = mysql_close($con); ?> <HTML> <BODY> <?= $body ?> </BODY> </HTML>

    • ベストアンサー
    • PHP
  • DBからの値をリストアップするとき目印別にテーブルを組みたい

    ■ 環境 PHP 5.0.4 Win、MySQL mysql 4.0.14b Win ■知識レベル HTMLタグ打ち、初歩SQLは理解可、PHP他プログラミング知識なし 文末のソースで以下のようなリストを作ることはできたのですが: n冊みつかりました。 ―――――― 価格 書名 ―――――― 1000 ○○○ 2000 △△△   : ―――――― テーブルに含まれるpublisherというフィールドを目印に出版社別にテーブルを 組んで表示したいのですが、どのように書き換えたらよいでしょうか。 n冊みつかりました。出版社が n社 ありますので出版社別に分けて表示します。 ×社 ―――――― 価格 書名 ―――――― 1000 ○○   : ―――――― □出版 ―――――― 価格 書名 ―――――― 2000 △△   : ―――――― : <?php $con = mysql_connect(SERVER, USER, PASS); $selectdb = mysql_select_db(MYDB, $con); $sql = "select * from book"; $rst = mysql_query($sql, $con); $recmax = mysql_num_rows($rst); $body = "<B>$recmax 冊みつかりました。</B>"; $body .= "<TABLE> <TR> <TD>価格</TD> <TD>書名</TD> <TR>\n"; while($col = mysql_fetch_array($rst)) { $body .= "<TR>\n"; $body .= "<TD>" . $col["price"] . "</TD>\n"; $body .= "<TD>" . $col["title"] . "</TD>\n"; $body .= "</TR>\n"; } $body .= "</TABLE>\n"; mysql_free_result($rst); $con = mysql_close($con); ?> <HTML><BODY> <?= $body ?> </BODY></HTML>

    • ベストアンサー
    • PHP
  • 縦に長い<table>でなく横に長い<table>を組むためのfor文の書き方

    文末のコードを実行すると、下記のような結果が得られますが、 番号 名前 性別   1 阿藤 男   2 江藤 男   3 加藤 女   4 木藤 女   5 工藤 男 行列を入れ替えた表をつくりにはどういうロジックになりますか。 番号   1   2   3   4   5 名前  阿藤  江藤  加藤  木藤  工藤 性別   男   男   女   女   女 おそらく、for文を改造するのでしょうが・・・ よろしくお願い致します。 <?php $con = mysql_connect(SERVER, USER, PASS); $selectdb = mysql_select_db(DB, $con); $sql = "select * from mytable"; $rst = mysql_query($sql, $con); $recmax = mysql_num_rows($rst); $body = "<table border='1'><tr><th>番号</th><th>名前</th><th>年齢</th><tr>\n"; for ($i = 0; $i < $recmax; $i++) { $col = mysql_fetch_array($rst); $body .= "<tr>\n"; $body .= "<td>" . ($i + 1) . "</td>\n"; $body .= "<td>" . $col["name"] . "</td>\n"; $body .= "<td>" . $col["age"] . "</td>\n"; $body .= "</tr>\n"; } $body .= "</table>\n"; mysql_free_result($rst); $con = mysql_close($con); ?> <HTML><BODY> <?= $body ?> </BODY></HTML>

    • ベストアンサー
    • PHP
  • PHP+MYSQLで直近3件のデータ表示

    直近のデータを3件表示するのに $sql =" select * from テーブル order by フィールド(date型) desc limit 3" ; だとうまくいくのですが DATETIME形に変えるとうまくいかないのは、何か変な事してますでしょうか? $sql =" select * from テーブル order by フィールド(datetime型) desc limit 3" ; 他の箇所は両方とも全く一緒です。 データは入れてあります。 宜しくお願いいたします。 全文は書けなかったので <?php require_once("dbini.php"); $con = mysql_connect($DBSERVER, $DBUSER, $DBPASSWORD); $selectdb = mysql_select_db($DBNAME, $con); $sql =" select * from mem order by rupdate desc limit 3" ; $rst = mysql_query($sql, $con); $recmax = mysql_num_rows($rst); $body = "<B>$recmax 件のデータがみつかりました。</B>"; $body .= "<TABLE border='1' cellpadding='2' cellspacing='0'> <TR> <TH bgcolor='#00CCCC'>会員ID</TH> <TH bgcolor='#00CCCC'>会員名</TH> <TH bgcolor='#00CCCC'>性別</TH> <TH bgcolor='#00CCCC'>ジャンル</TH> <TR>\n"; while($col = mysql_fetch_array($rst)) { $body .= "<TR>\n"; $body .= "<TD>" . $col["id"] . "</TD>\n"; $body .= "<TD>" . $col["name"] . "</TD>\n"; $body .= "<TD>" . $col"seibetu"] . "</TD>\n"; $body .= "<TD>" . $col["cate"] . "</TD>\n"; $body .= "</TR>\n"; } $body .= "</TABLE>\n"; mysql_free_result($rst); $con = mysql_close($con); ?> 以下 <?= $body ?> を貼り付けています

    • ベストアンサー
    • PHP
  • select文

    こんばんは。PHPでデータベースからレコードとフィールドを表として取り出そうとしてますが、うまく行きません。 MySQLへの接続はうまくいってると思うので、while文が間違ってるのでしょうか?PHPのバージョンはPHP Version 4.4.2です。 よろしくお願いしますm(__)m <?php require_once("dbini.php"); $con = mysql_connect($server, $user, $pass); $select = mysql_select_db($dbname, $con); $sql = "select * from book"; $rst = mysql_query($sql, $con); $body = "<table border='0' cellpadding='5' cellspacing='5' width='500'><tr><td>\n"; while($col = mysql_fetch_array($rst)) { $body .= "<b><font size='+2'>".$col["title"]."</font></b>" $body .= "</td></tr>"; $body .= "<tr><td colspan='2'>".$col["article"]."</td></tr></table>"; } mysql_free_result($rst); $con = mysql_close($con); ?> <html> <body> <?= $body ?> </body> </html>

    • ベストアンサー
    • PHP

専門家に質問してみよう