• ベストアンサー

MySQLの一部を、計算した後に表示させたい

答えにたどり着けず困っており、質問の方させていただきました。 下記のようなデータベースのテーブルがあります。 id kyouka ten 1 国語 80 2 算数 20 3 社会 55 4 理科 73 カラム「ten」のデータ「20」と「55」を、 PHP上で 実力テスト 算数は  10点/50点満点中 期末テスト 社会は 27.5点/50点満点中 と計算させて表示させたいのですが、PHPでどのように呼び出せば良いのでしょうか? どなたかご教授宜しくお願い致します。

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

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

  • ベストアンサー
  • utakataXEX
  • ベストアンサー率69% (711/1018)
回答No.4

#2、3です。 >私の中で、データベース=エクセルのもっと膨大なもの これはむしろ「違う」と考えた方がいいでしょう。 MySQLのようなデータベースシステムの事を、RDBMS(関係データベース管理システム)と言いますね。 Excelの場合もシートとシート(または範囲)をvlookupなどで関連づけられますが、これはあくまでも「後付け」の話です。 「関係データベース」と言うくらいですから、まず、「表と表の関連」ありきなんです。 (言わば集合論なんですよ) >A B C D E >+------------------------- >1| A君|B君|C君|合計点|平均点 >+------------------------- >2| 53|66|90|=A2+B2+C3|=D2/3 >+------------------------- ↑ で、これはRDBMSが苦手とするアプローチです。 SQLで実装するならこう。 ↓ |名前|点 +---------- |A君|53 +---------- |B君|66 +---------- |C君|90 +---------- |合計点|sum() +---------- |平均点|avg() +---------- select name , ten from tbl union select '合計点' as name, sum(ten) as ten from tbl union select '平均点' as name, avg(ten) as ten from tbl; 合計と平均については、上記のように、UNIONを使えば、1つのSQLでできます。 ですが、これだとSQL自体の実行時間が余計にかかります。 どうせwhileループするなら、敢えてSQLで取得せず、whileループ内で合計と平均を出す事をお薦めします。 つまり、実行するSQL文は ↓ select name , ten from tbl だけにすると言う事です。 まあ、tblの件数が1000件とか2000件とかなら1回のSQLで持ってくるのも、有りですけどね。

rabbit-kimura
質問者

お礼

お礼遅くなりました!! ありがとうございました!!

rabbit-kimura
質問者

補足

遅くにありがとうございます!! 調べた時に、データが1000件、2000件、10000件とあったら、やっぱりデータベースの方がいい…みたいなことがあったので、かなり=で考えていました。 >>これはRDBMSが苦手とするアプローチです。 おぉ!! mysql探していた時に |名前|点 +---------- |A君|53 +---------- |B君|66 +---------- |C君|90 +---------- |合計点|sum() +---------- |平均点|avg() +---------- の形ばかりが多くて苦労していたのですが、 「苦手」ということだったのですね!! すごく納得しました!!

その他の回答 (3)

  • utakataXEX
  • ベストアンサー率69% (711/1018)
回答No.3

#2 です。 WHERE句については自己解決できたようで何よりでした。 (1) SQL文を書いてデータセットを取得する場合(ローレベルなアプローチ) (2) データアクセス用のAPIにまかせる場合(でも若干SQL寄り) (3) O/Rマッパーなどフレームワークを使用し、もはやSQLの「エ」の字も出てこない場合 上記の内、質問者様の場合は(1)に該当します。 つまり、解決された方法の通り、基本的に「実際にSQLを書いている」のですからWHEREでもORDER BYでも書いてください。 ザッと見た感じでは、質問者様の場合、PHPの基本的なシンタックスは概ね理解されているようですが、やはり、 「要件をどのようにデータモデルとして表すか」 「そのデータモデルから要件の内容をどのようなSQLで実装するか」 と言う部分が弱いように思います。 (前者は確かに初心者の内は難しいと思いますが、後者は基本的な部分ですので、ここをクリアしないと先へ進めません) >SELECT (ten/25) AS ten FROM test 「ten」しか持って来ていないのですから、kyoukaもvoteValueも出しようがありません。 $row配列に入っている事を前提とするなら、kyoukaもvoteValueもSELECTする列に含まれていなければいけません。 voteValueは(おそらく)(ten/25)ですよね? それなら、SELECT文は $sql = "SELECT kyouka, (ten/25) AS voteValue FROM test"; でなくてはいけません。 前の回答で書いたとおり、計算した結果を使いたい場合は、「SQL側に仕事をさせる」でもよいし、「単純に値だけ取得してPHP側に仕事をさせる」でも構いません。 例えば、後者の場合、SQLは単純に $sql = "SELECT kyouka, ten FROM test"; としておき、voteValueはwhileループ内で$row["ten"]を除算して$voteValue(←配列ではない点に注意)にセットしてTABLEタグに追記していけばよいのです。

rabbit-kimura
質問者

お礼

SQL内の計算、 UPDATE `table` SET `ten` = `ten` / 2 を使ったらできました!!! でも、自動ではないのですね(*_*) なんか、話がいったりきたりしててすみません… でも、かなり勉強になりました (検索もどんな語句で探せば良いかわからない状態から始めてたので・・・) 私も早く人に教えられるくらいになりたいです、ありがとうございます!!

rabbit-kimura
質問者

補足

あぁ、ありがとうございます!! 先にお礼を言いたかったので、補足で失礼します!! >>voteValue すみません、ネットで拾ったもの、そのままコピーしてました。。。 >>$sql = "SELECT kyouka, (ten/25) AS voteValue FROM test"; ご回答いただいた後、「kyouka,」と入れるのも、他サイトで見て試したのですが、♯2さんに教えていただいていた >>select concat(kyouka, 'は', form~ に追加したりいじってて結局できずで、違ったのか…と思ってたのですが、そういうことだったのですね!! >>ザッと見た感じでは、質問者様の場合、PHPの基本的なシンタックスは概ね理解されているよ… そんなご指摘いただけるとは、本当ありがたい限りでございます!! どうしても仕事で必要になり、基礎をしらないままネットと本を片手に、必要なものだけをおいかけていたし、知識のある方が全くいなかったので、何がなにやら… と、質問もろくにできないのですが、本当に丁寧にご回答いただいて涙が出るほど感謝しています!! >>「SQL側に仕事をさせる」 やはりできるのですね!! 私の中で、データベース=エクセルのもっと膨大なもの という認識があり、もしや、カラムを1つ作り エクセルでいう、 A B C D E +------------------------- 1| A君|B君|C君|合計点|平均点 +------------------------- 2| 53|66|90|=A2+B2+C3|=D2/3 +------------------------- みたいなことを探していました!! 本当、丁寧にありがとうございます!!

  • utakataXEX
  • ベストアンサー率69% (711/1018)
回答No.2

tenについては「とにかく」/2すればよいのだ、と言う事は#1さんへの補足でわかりました。 しかし、#1 さんも書かれている通り、まだ、それ以外の「要件」「仕様」がわかりません。 もしテーブルが1つしか無く、カラムの内容も質問の通りだとすると、「算数が実力テスト」で、「社会は期末テスト」で、「国語と理科は表示しない」と言う「要件?」を実装する方法が存在しません。 しかしながら、とにかく "/2 する"と言う要件は出していただいたので、そこについてだけは以下のようなSQL文で取得可能です。 select concat(kyouka, 'は', format(ten / 2, 1), '点/50点満点中') as kekka from テーブル 結果はこうなります。 ↓ +------------------------- | kekka +------------------------- | 国語は40.0点/50点満点中 | 算数は10.0点/50点満点中 | 社会は27.5点/50点満点中 | 理科は36.5点/50点満点中 +------------------------- 4 rows in set (0.00 sec) そもそも、このようなSELECT文で複数行取得した検索結果を「どんな形でもよいので」PHPで、TABLEタグなりTABLEっぽいCSSなりで表示する部分は実装できていますでしょうか? また、わかりやすくするために上記のようなSQLにしましたが、ten の結果はどちらかど言えば、普通に select id, kyouka, ten from テーブル を実行した結果を取得して、PHP側で除算するのが普通だと思います。 以上、ご参考までに。

rabbit-kimura
質問者

お礼

ありがとうございました!! いろいろ触ってたら、WHERE句もできました!! ただ、concat(セル結合する動作なのですね!!)を使うと、他のカラムを表示させたいときに表示されないのですね…頑張って奮闘します。

rabbit-kimura
質問者

補足

1日本とにらみ合ったり、他でも質問させていただいたり、 ちょっと理解してきたようで、本当質問の内容が不十分であること、身にしみてわかりました。 テーブルもできております、今質問を拝見させていただき試してはいないのですが、現在の状況といたしまして、 <?php //データベースへ接続・切断・・・省略 $sql = "SELECT (ten/25) AS ten FROM test"; $result = executeQuery($sql); $rows = mysql_num_rows($result); if($rows){ while($row = mysql_fetch_array($result)) { $table .= "<tr>"; $table .= "<td>".$row["kyouka"]"は</td><td>".$row["voteValue"]."点/50点満点中</td>"; $table .= "</tr>\n"; } $msg = $rows."件のデータがあります。"; }else{ $msg = "データがありません。"; } //結果保持用メモリを開放する mysql_free_result($result); ?> web上のテーブル <table> <tr><th>テスト</th><th>点数</th></tr> <?= $table ?> </table> こんな作りになっています。 SELECT (ten/25) AS ten FROM test ですと、webでは"kyouka"の部分が表示されませんでした。 兼ね合いとかあるのかな・・・と思って探していたのですが、なかなか答えに辿りつかずで、 早速参考にさせていただきたいと思います!! ついでとなり申し訳ないのですが、増えた時の検索が可能なよう、 上記SELECT文の後に、WHEREやオーダーなど「半角スペース」で続けて書いても良いものなのでしょうか?

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

情報が足りなさすぎ ・算数が実力テストで社会が期末テストだという情報がDBに見当たりません。 ・なぜtenが半分になるかロジックがたりません。 ・国語と理科はどう処理すればいいのかがわかりません。

rabbit-kimura
質問者

お礼

情報の不十分な質問、本当に申し訳ございませんでした。 また、わざわざご回答をいただき、誠にありがとうございました。 もっと精進致します。

rabbit-kimura
質問者

補足

例を書いたのが逆にわかりづらくなったのでしょうか・・・ 簡単にいいますと「20」をweb上で「10」とだけ表示させたかったのですが、 (Selectになるのでしょうか・・・?) オーダーByだと、どれかのカラムで並び替えた1つめ...となると解釈しているのですが、 上の例でいいますと、 「社会」の「ten」をweb上で表示するときに/2をする というニュアンスです。 質問の仕方もわからず申し訳ございません。 基礎の本を片手になんとかチャレンジはしているのですが、 どうも「関数・変数・数値」など、PHPで使用される言語になれていないこともあり、 探し方もままなってなかったように思えます。 もう一度出直してこようと思います、ご迷惑おかけ致しました。

関連するQ&A

  • 算数の問題です。

    かずやさんは、国語・算数・理科・社会の4つのテストを受けました。 どれも100点満点のテストです。 国語・算数・理科の平均点は国語の点より2点高く、国語・理科・社会の平均点は国語の点より6点低いとき、算数の点は社会の点より何点高くなりますか。   問題集の1問で、解説には、  (国語+算数+理科)-(国語+理科+社会)の点の差、つまり、算数と社会の点の差です。  2×3+6×3=24(点) とあります。どうしてこうなるのか、くわしく解説頂ける方、よろしくお願いします。

  • 平均

    小学生の問題です。 かずやさんは国語、算数、理科、社会の4つのテストを受けました。どれも100点満点のテストです。 国語、算数、理科の平均点は国語の点より2点高く、国語、理科、社会平均点は国語の点より6点低い時、算数の点は社会の点より □点 高くなります。 求め方を教えて下さい。

  • 【大至急!】平均の計算

    こんばんは! 大人にもなって恥ずかしいのですが、平均の計算について自信がもてないので教えていただきたいです。 算数の小テスト(10点満点)、国語の小テスト(5点満点)として、A君は算数が9点(90%)、国語が4点(80%)だったとき、平均得点率は(90+80)÷2=85%でよろしいのですよね? それぞれのテストを合計して、得点/満点、すなわち(9+4)÷(10+5)×100=86.7%とするのは間違いですよね?

  • 出来る子の参考書・・自由自在とパーフェクトコースと

    現在中1の甥は、実力テストで、数学・英語ともに90点台です。 理科は80点台後半に落ちました。 国語と社会はまだ帰ってきてませんが、期末はどちらも70点台でした。国語は苦手のようです。暗記する社会も暗記がめんどくさいみたいです。 中1、4月の実力テスト(小学校の範囲)では、甥は満点を取りました。学年で3人だけが満点だったそうです。小学校時代の内容は身についていると思います。 そんな甥は、私や母に質問してくることがあります。 しかし、私は勉強はさっぱりなので、参考書を買って調べろと言おうと思いました。 そこで、出来る甥のために絞った2種類が、自由自在とパーフェクトコースです。 塾で習わない科目が国語、社会で、塾で月1だけ習うのが理科で、国語と理科と社会だけを買う予定にしています。 アマゾンで中古で買うとお得なのが自由自在で気になっているのですが、ちゃんと役立つ方を買いたいです。 どちらが良いのかアドバイスお願いします。本人に言ったら悩んで決められないとのことでした。

  • 息子の宿題

    小5の算数の宿題で、恥ずかしながらどーしてもわからない問題があるので回答よろしくお願いします。 ”国語、社会、算数、理科のテストをしました。国語、社会、理科の3つのテストの平均点は86点ですが、算数を入れた4つのテストの平均点は85点になります。算数の点数は何点でしょうか。”

  • ACCESS2007で成績管理

    成績管理システムを作成したいのですが、どなたか教えてもらえませんか?Access 2007の勉強中の超初心者です。 課題:    システム概要は、下記のとおりです。    試験の種類は、各学期(3学期制)ごとに中間テスト、期末テスト、実力テストの   3種類有ります。    試験科目は、国語、算数、理科、社会です。(各科目の点数は100点満点です。)    学校は、1年~3年生まで5クラスあり、子供たちには、クラス毎に出席番号が付   けられています。    ※1クラスの人数は最大50名です。    1年を通じてデータ管理するものとします。※一人の生徒に対して複数年管理する   ことはありません。      テーブル作成について    下記のテーブルを作成     生徒MT       出席番号 名前 クラス       1101 A君 1年1組       1102 B君 1年1組       2101 C君 2年1組 2102 D君 2年1組 3101 E君  3年1組 のように1年、2年、3年それぞれ5クラス      教科名MT        教科番号  教科名         1.     国語         2.    算数         3.    理科         4.    社会 試験名MT 試験名番号  試験名 101    1学期中間テスト 102    1学期期末テスト 103    1学期実力テスト 201    2学期中間テスト 202     2学期期末テスト 203    2学期実力テスト 301    3学期中間テスト 302    3学期期末テスト 303    3学期実力テスト 作成するフォーム     1.試験結果を入力するフォーム     2.入力した結果を参照することが出来る表形式のフォーム  どのような考え方でテーブル作成、クエリ作成、リレーショナルなテーブル設計等をすればよいのか 教えてください。

  • 小学5年生の算数の平均の問題

    子供に算数の問題の解き方を聞かれましたが、全く解らず困っています(;_;) 解る方がいらっしゃるなら教えてください。 問題 国語と算数と理科のテストをしました。 国語と算数と理科のテストの平均は82点です。 国語と算数のテストの平均は80点です。 算数と理科のテストの平均は85点です。 問題 (1)理科は何点でしょうか? (2)国語は何点でしょうか? (3)算数は何点でしょうか? と言う問題です。 よろしくお願いします。

  • PHP+MySQLから結果セット取得後の計算方法

    PHP+MySQLから結果セット取得後の計算方法を教えてください。 イメージは以下になります。 以下、testtable とします。 生徒|国語|算数|理科|社会 A 60 80 90 60 B 80 60 70 65 C 95 30 50 90 D 100 95 85 90 そこで、国語が80点以下の生徒を検索し、抽出した生徒の算数平均点数を導きたいのです。 //国語が80点以下の生徒を抽出 $sql="SELECT * from testtable WHERE 国語<=80"; $rst= mysql_query($sql); 上記で国語が80点以下の生徒を検索出来たと思うのです。 イメージは下記になります。 生徒|国語|算数|理科|社会 A 60 80 90 60 B 80 60 70 65 算数の平均を求めるので、(80+60)/2の式を書きたいのです。 平均の2は、mysql_num_rows($rst)で導き出せるのですが、 (80+60)の部分がわかりません。 while ($col = mysql_fetch_array($rst)){ $sum=$sum+$col[算数];} $body.= "平均".$sum/mysql_num_rows($rst)."点"; でよいでしょうか。 ご教授願います。

    • ベストアンサー
    • MySQL
  • 中間、期末テストと実力テストの差

    千葉県の三学区内に住んでいる中三の受験生です 私は学校の中間、期末のテストと実力テストの差がものすごくあります中間、期末の順位は5科が110位くらいなのに実力テストは60位~80位です。一番嫌いな英語の点数は中間、期末は30点以下なのに実力テストは60点ぐらい取れます。残りの4科の点数は国語は中間、期末が50点くらいで実力テストは60点くらいで、数学は中間、期末と実力テストの差はなくどちらも大体60点くらい取れます。理科は1分野と2分野でかなり違いますが大体50点くらいで実力テストは60点くらいで、社会は中間、期末と実力テストの差はあまりなくどちらも80点以上取れます。 通知表は英語が2で社会が4であとは全部3で9科は音楽が4ぐらいです。あとは一年の時税の標語が国で入選したくらいです。 私は柏中央に行きたいと思っています。このままでは行けないのは分かりますでも二学期がんばれば行けるんでしょうか?また通知表はどのくらい取れれば良いんでしょうか?

  • 2つの異なるテーブルを和結合し、重複のない名前だけ出力する方法

    2つの異なるテーブルを和結合し、重複のない名前だけ出力させるSQLを書きたいのですが どこが間違っているでしょうか? select distinct name from ( select name from test1 union select name from test2 ) ; test1テーブル name 国語 算数 理科 社会 test1テーブル name 国語 体育 家庭科 社会 結果 name 国語 算数 理科 社会 体育 家庭科