mysql検索方法:スマートに2011年の巨人二軍の勝敗と勝率を算出する方法

このQ&Aのポイント
  • mysqlの検索方法で悩んでいます。一番スマートな方法を教えていただけたらありがたいです。
  • 巨人一軍と巨人二軍の各試合結果を格納しているテーブルがあります。ここから、2011年の巨人二軍の勝敗を集計する。
  • このデータベースから2011年の巨人二軍の勝敗(○勝□敗)及び勝率(0.55等)をスマートに算出するには、どう行いますか?
回答を見る
  • ベストアンサー

mysql 検索方法

現在、mysqlの検索方法で悩んでいます。一番スマートな方法を教えていただけたらありがたいです。 内容)巨人一軍と巨人二軍の各試合結果を格納しているテーブルがあります。ここから、2011年の巨人二軍の勝敗を集計する。 テールブル) ■チームテーブル(id,チーム名) 1,巨人一軍|2,巨人二軍|3,・・・とデータが入っている。尚、idはプライマリーキー ■試合結果テーブル(r_id,自チームid、相手チーム、自チーム得点、相手チーム得点、試合年月日) 1,1,阪神一軍,2,3,2011-05-01|2,1,阪神一軍,5,10,2011-06-01|3,2,広島二軍,1,0,2011-05-02|・・・とデータが入っている。尚r_idはプライマリーキー このデータベースから2011年の巨人二軍の勝敗(○勝□敗)及び勝率(0.55等)をスマートに算出するには、どう行いますか? mysql 5.0.75-0 ubuntu Apache/2.2.11 (Ubuntu) PHP/5.2.6-3ubuntu4.6

  • MySQL
  • 回答数2
  • ありがとう数4

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

  • ベストアンサー
  • yamada_g
  • ベストアンサー率68% (258/374)
回答No.2

スマートかは分かりませんが、SQLで全部計算するなら下記のような感じではどうでしょうか。 select   チーム名,勝数,負数 /* ,引分数 */ ,勝数 / (勝数 + 負数 /* + 引分数 */) 勝率 from  (select    a.チーム名   ,count(case when b.自チーム得点 > b.相手チーム得点 then 1 else null end) 勝数   ,count(case when b.自チーム得点 < b.相手チーム得点 then 1 else null end) 負数   --,count(case when b.自チーム得点 = b.相手チーム得点 then 1 else null end) 引分数  from チームテーブル a   inner join 試合結果テーブル b   on a.id = b.自チームid   and b.試合年月日 like '2011%'  where a.id = '2'  group by a.チーム名); 引分は無いのであれば、その部分は無視してください。 試合年月日のデータ型が分からなかったので違うようであれば適当に修正してください。

crash___
質問者

お礼

回答ありがとうございます。だいぶやりたいことに近い結果が得られました。 ちなみに最後のセミコロンの前にas ○○をつけないとerror 1248がでるようです。

その他の回答 (1)

  • marutone
  • ベストアンサー率40% (70/174)
回答No.1

まずは以下のSQLを実行します。 SELECT '1' AS 管理ID, COUNT(*) AS 勝数 FROM 試合結果テーブル WHERE 試合結果テーブル.自チームid = '2' AND 試合結果テーブル.自チーム得点 > 試合結果テーブル.相手チーム得点 UNION SELECT '2' AS 管理ID, COUNT(*) AS 負数 FROM 試合結果テーブル WHERE 試合結果テーブル.自チームid = '2' AND 試合結果テーブル.自チーム得点 < 試合結果テーブル.相手チーム得点 そしてこのデータを取得した後にPHP側で、 $勝率 = 勝数 / (勝数 + 負数); とすれば良いと思います。

crash___
質問者

お礼

回答ありがとうございます。大変勉強になりました。

関連するQ&A

  • MySQLの構造について

    応援しているサッカーチームの試合データをMySQLを利用しテーブルに格納したいと考えています。 そこでMySQLやPHPに詳しい方にお聞きしたいことがあります。 例えばA・B・Cと3チームあるとしたら、A対B、A対Cの試合データは格納しますが、B対Cのデータは不要です。あくまでもAチームに関するデータのみを格納し、私が開設しているサイトで閲覧者に検索フォームから自由な形でデータを参照できるようにしたいです。 参考までに格納したい試合のデータは下記のようなデータです。 http://www.j-league.or.jp/result/2014/j2/030201.html 現在、既に一定のデータはテーブルに格納しています。現在のテーブルの構造です。 https://www.dropbox.com/s/z2qc2zff2fn8m8f/gamedb.pdf?dl=0 スタメンの選手やベンチの選手、交代選手、警告をもらった選手、得点者などはテーブルに格納していません。これらのデータは試合ごとに大きく数が異なるのでどのようにして格納すれば良いのか分からなかったので。 現在は格納していないこれらのデータを格納することで下記のような条件を指定しても対象データが羅列されるようにしたいです。 ・○○選手がイエローカードをもらった試合。 ・点を取られている選手ランキング。□□選手(※対戦相手の選手)には一番点を取られているなど。 ・○○選手がスタメンだった試合。 ・○○選手が途中出場した試合。 ・○○選手はこれまで△試合に▲分出場している。 ・□分~□分の間の得点は何点。逆に失点は何点など。 などなどです。 私が現在思いついている構造ですが、新しくテーブルを複数作成する。こういったケースではそれぞれのテーブルに共通のIDを振る必要があるとのことですが、これは日付(開催日)で代用しようと思っています。同じ日に2試合は絶対にないので。 作成するテーブルは下記のようにします。 ・ホームチームスタメンテーブル ・アウェーチームスタメンテーブル ・ホームチームの警告をもらった選手テーブル ・アウェーチームの警告をもらった選手テーブル ・ホームチーム得点者テーブル ・アウェーチーム得点者テーブル .....などなど。 こういったテーブルを作成し、それぞれID(開催日)と一定数のカラムを予め用意する。得点者のテーブルでしたら1試合で一方のチームが10点を取ることは限りなく0に近いのでとりあえず10用意する。同じように得点した時間も10用意。 datadating(開催日) | goal_1_min(得点時間) |goal_1(得点者) | goal2_min(得点時間) | goal2(得点者) |.......... このように格納していけば思い通りの結果が得られるようになるのかな?と思っていますが、果たしてこのようなテーブルで作成していき、後々サイト側の検索フォームから指定した条件で無事に結果を得られるか不安です。 ちょっとしたことでも良いので、詳しい方の意見をお聞きしたいです。 どうぞよろしくお願いします。 長文失礼しました。

    • ベストアンサー
    • MySQL
  • Mysqlを使用した構造

    現在試合結果ページを作成しています。 参考サイト:http://www.so-net.ne.jp/antlers/games/484 上記が参考サイトであり、各表組み(レイアウト)は完成しています。 マッチレビューから下は作っていませんので省きます。 残りは上から順にスコア、得点者、各詳細(シュートの本数など)、警告者、メンバー(スタメンとサブ)。 Mysqlにて1.試合日程 2.試合結果のテーブルを作りました。 テーブル内の構図は 1.試合日程のテーブル id、日付、対戦相手、場所など 2.試合結果のテーブル id、試合日程id、得点、失点、各詳細 を作りました。 ここからが困っており、得点者、警告者、メンバー(スタメンとサブ)の構図なんですが、 各項目ごとにテーブルを作った方がよいのか、試合結果テーブルに入れた方がよいのか迷っています。 自分が考えていたのは 3.得点者テーブル id、試合結果id、ホームの得点者、アウェイの得点 4.警告者テーブル id、試合結果id、ホームの警告者、アウェイの警告者 5.メンバー(スタメンとサブ)のテーブル id、試合結果id、ホームのスタメン、ホームのサブ、アウェイのスタメン、アウェイのサブ として作ることを考えていたのですが、いかがでしょうか? 一番効率がよく早く出来る方法を教えていただけないでしょうか? 宜しくお願いします。

  • mysqlでの検索方法について

    初めて質問をさせて頂きます。初心者にてどうにも行き詰ってしまいアドバイスを頂けたらと思います。 野球の打率ランキングを出したいのですが、最終的には下記の条件で抽出したいと思っております。 1位 A君 0.333 2006年 2位 B君 0.321 2008年 3位 C君 0.300 2007年 ・・・ 環境としましては、PHP4.4.4 MYSQL4.0(レンタルサーバー) テーブル record ID(INT)|選手番号(INT)|安打(INT)|打数(INT)|年度(INT)|試合番号(INT)| 1 | 1 | 1 | 1 | 2008 | 10 | 2 | 1 | 0 | 1 | 2008 | 10 | ・・・ というように、選手の1打席毎にレコードがあります。 また規定打数を試合数×3.1と設けて、その打数に達しないものは抽出しないようにしたいのです。 SELECT round(sum(安打) / sum(打数),3) as daritsu, 選手番号, 年度 FROM record GROUP BY 選手番号, 年度 HAVING sum(打数) > count(distinct(試合番号)) * 3.1 ORDER BY daritsu DESC LIMIT 0 , 10 と考えてみたものの、この場合は選手の出場試合数×3.1となってしまい、チームの試合数ではありません。行き詰っているのは、年度毎のチームの試合数に対して規定打数を設定することだと思います。 条件のような抽出が難しいようであれば、抽出後にPHPで処理という形でも構いませんので、アドバイスの程よろしくお願い致します。

    • ベストアンサー
    • MySQL
  • セリーグの順位の決め方

    阪神優勝、横浜ブッチギリ最下位のセリーグですが、 もし、中日が残りの巨人戦1試合、広島戦2試合を引き分けた場合、2-5位の4球団が引き分け3試合となります。 となると、勝敗によっては4球団すべてが同じ勝敗(引き分け数)になる可能性もあるのですが、その場合は順位は、当該チームの対戦成績などによって必ず付けることになるのでしょうか。 もし付けないとなると、万一上記の勝敗表になった場合、優勝:阪神、2位:4球団、6位:横浜となり、横浜以外はすべてAクラスという事になるのでしょうか。

  • MySQLの構文についてです・・・

    いつもお世話になります。 MySQLの構文について悩んでおりますので、アドバイス頂けたらと思います。 環境 MySQL4.0 チームテーブルには各球団の情報があります。 team_table team_id | チーム名  1 | ジャイアンツ  2 | ドラゴンズ  3 | タイガース  4 | ベイスターズ  5 | スワローズ  6 | カープ ----------------------- スケジュールテーブルには対戦カードと審判割当があります。 レコードにはteam_idが入力されています。 schedule_table  id | 対戦チーム1 | 対戦チーム2 | 審判チーム1 | 審判チーム2 |   1 |   1   |   2   |   3   |   4   |  2 |   3   |   4   |   5   |   6   |  3 |   5   |   6   |   1   |   2   | --------------------------------------------------------------- この2つのテーブルから  id | 対戦チーム1 | 対戦チーム2 | 審判チーム1 | 審判チーム2 |  1 |ジャイアンツ |ドランゴンズ | タイガース | ベイスターズ|  2 | タイガース | ベイスターズ| スワローズ |  カープ  |  3 | スワローズ |  カープ   |ジャイアンツ |ドランゴンズ | と表示したいのですが、 INNER JOIN で結合するにも4回行わなければならないのと、フィールド名がかぶってしまうので、もっとスマートな方法がないかと考えております。 大変未熟なためアドバイスを頂けたらと思いますので、よろしくお願い致します。2人くらいの方からアドバイス頂けましたら、迅速に締め切り、ポイント付与させて頂きます。

    • ベストアンサー
    • MySQL
  • プロ野球試合途中の降雨コールド(試合成立)について

    先日の阪神xヤクルト戦を観ていて疑問に思ったのですが この試合9回の表ヤクルトの攻撃中に雨が激しくなってコールドとなりました(試合は成立) この時9回の表のヤクルトの得点1は認められて10-5で阪神の勝ちでした 私は表の攻撃途中でのコールドの場合には、その前の回までの得点で 勝敗を決めると思っていましたが、そうではないようです しかし、それでは、この試合を例にすると 9回の表に、同点もしくは逆転となり、なんらかの原因(この場合は雨ですが)で 試合続行が不可能でコールドにする場合 先攻のチームの勝ち(もしくは引き分け)となってしまうのでしょうか? つまり9回の表途中までの得点で勝敗が決まるって事でしょうか? (裏の攻撃が残っているのに) なんかおかしい気がするのですが コールドゲームの規定を教えてください よろしくお願いします

  • なぜもう優勝決定?

    今日巨人が負け阪神が勝ったため巨人の優勝が決定しましたが,まだ両チームが並ぶ確率があるのでは?今の時点で両チーム間のゲーム差は1.5ですが,巨人が残りの1試合を負けて阪神が残りの2試合を勝てば並ぶのでは?まあ僕は巨人ファンだからいいのですが・・・

  • 巨人のチーム防御率はなぜ悪いのか?

    昨今、巨人の長期低迷が続き、 テレビ視聴率の低下、野球人気の低下 が叫ばれていますが、なににもまして 巨人があまりにも弱すぎる、というのが すべての原因だと思います。 今日現在の人気2球団、阪神と巨人の データを比べてみますと、 阪神 防御率2.96 打率262 巨人 防御率3.80 打率251 と、たしかに、どちらも劣っていますが、 得点だけをみると 阪神336 巨人356 と阪神を上回っているじゃ、ないですか。 試合数は3試合しか違いません。 ただ失点は、阪神281 巨人376 と95点のひらきがあります。 と、データ上考えると、スモールベースボール の崩壊は、貧打にあるのではなく、 投手陣にあるのではないか、というのが私の 見解です。 去年からチーム防御率の改善が 全くみられないのは、これはどういう原因 があるのか?みなさんに意見を頂きたいのです。

  • 何年度の巨人の優勝だったか思い出せないんですが・・・

    いつの巨人の優勝だったか知りたいのです。 甲子園の阪神vs巨人の試合で、その試合に巨人が勝つか マジック対象チームが負けたら巨人の優勝が決まる試合で、 試合の途中で対象チームが負けて巨人の優勝が決まり 後は阪神との試合が終われば胴上げを待つばかり。 巨人が最終回まで勝っていたのに9回裏に追い付かれ 夜遅くまで延長戦が続き最後は阪神のサヨナラ。 六甲おろしが終わった後シラけた巨人の胴上げ。 何年度だったでしょうか? 監督は原だったような気がします。

  • SQL文について質問があります。

    すみません、質問させてください。 [team_tbl] ------------------------- team_id | team_name ------------------------- 1|巨人 2|阪神 3|中日 4|ヤクルト 5|広島 6|横浜 ------------------------- [ranking_tbl] ------------------------- team_id | rank 1|5 2|1 3|4 4|2 5|3 6|6 -------------------------- 上記のようなテーブルがあるとします。 team_tblはチームIDとチーム名のフィールドをもち ranking_tblはteam_tblのチームIDとランキング順位の フィールドを持っています。 この二つの表から team_id | team_name 1|阪神 2|ヤクルト 3|広島 4|中日 5|巨人 6|横浜 というデータを上記の順で表示させたいのですが、 どうしてもどうしてもうまくいきません。 どのようにすればいいでしょうか? アドバイスお願い致します。