PHPやMySQLを使ったサッカーチームの試合データの抽出方法

このQ&Aのポイント
  • PHPやMySQLの勉強を兼ねてサッカーチームの試合データをテーブルに格納しました。ホームゲームとアウェーゲームの得点データを抽出する際のSQL文について教えてください。
  • テーブル名は「gamedata」で、左からホームゲーム(H)かアウェーゲーム(A)か、ホームチームの得点、アウェーチームの得点という順番です。
  • 問題点は、ホームゲームの場合は「home_score」に得点が格納されていますが、アウェーゲームの場合は「away_score」に得点が格納されていること、また、得点が未入力のデータもあることです。この条件に基づいて2得点以上5得点未満の試合データを抽出するSQL文を教えてください。
回答を見る
  • ベストアンサー

条件によって抽出するデータを変える

PHPやMySQLの勉強を兼ねてサッカーチームの試合データをテーブルに格納しました。 テーブルは下記のようにしました。他にもフィールドはありますがとりあえず3つのみ。 左からホームゲーム(H)かアウェーゲーム(A)か。ホームチームの得点。アウェーチームの得点です。 table名:gamedata h_a(VARCHAR型)|home_score(INT型)|away_score(INT型) H|5|3 A|2|1 A|3|4 このようなテーブルから「2得点以上5得点未満の試合」を抽出したい場合はどのようなSQL文になるのでしょか? 上記のテーブルだと「A|3|4」このデータだけ抽出されることになります。 問題点だと思うのは下記の二つ。 一つはホームゲームの場合は「home_score」に得点が格納されていますが、アウェーゲームの場合は「away_score」に得点が格納されていることになります。 二つ目はデータがまだ不十分で得点が何も入力されていないデータもあるという点です。こういうデータはスルーしたいです。 ご存知の方いらっしゃいましたらご教示ください。 よろしくお願いします。

  • MySQL
  • 回答数1
  • ありがとう数1

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

  • ベストアンサー
  • t_ohta
  • ベストアンサー率38% (5078/13272)
回答No.1

「2得点以上5得点未満の試合」はhome_scoreとaway_scoreの両カラムがという事でしょうか。 それとも自チームが「2得点以上5得点未満の試合」という事でしょうか。 両カラムならば select * from gamedata where home_score >= 2 and home_score < 5 and away_score >= 2 and away_score < 5; 自チームという事なら select * from gamedata where (h_a = 'H' and home_score >= 2 and home_score < 5) or (h_a = 'A' and away_score >= 2 and away_score < 5);

tanaka_kenta
質問者

お礼

回答ありがとうございます。 私の説明不足でした。申し訳ありません。 自チームのスコアのみが対象でした。 先ほどご教示頂いた通りに実行したら無事できました。 本当に助かりました。ありがとうございました。 参考書ではこのような複雑なSQL文は記載されていない為、大変勉強になりました。 ありがとうございました。

関連する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
  • 得点数が多い順に並べて表示する

    PHPとMySQLでデータサイトを作成しています。 詳しい方に二点ほどお聞きしたいのですが。 テーブルは下記の通りです。データベース名はgame。 フィールドについて「issue」は結果。「h_a」はホームかビジターか。「h_score」はホーム側スコア。「a_score」はビジター側スコア。「opponent」は対戦相手です。 テーブル名:game issue(VARCHAR型)|h_a(VARCHAR型)|h_score(INT型)|a_score(INT型)|opponent(VARCHAR型) ●|H|8|9|チームB ○|A|2|8|チームC ●|H|4|9|チームD ○|A|3|3|チームB 一点目。 格納したデータから自分のチームのスコアが多い順に10ほど並べたいと思っています。 問題はホームゲーム時(H)の場合はホーム側スコア(h_score)、ビジター(A)の時はビジター側スコア(a_score)を適用することです。 現在は下記のようなコードしか記述していません。 $stmt = $dbh -> query("SELECT * FROM game ORDER BY () DESC LIMIT 10"); 二点目。 対戦相手ごとに勝率を計算し、勝率が高い順から10ほど並べることは可能でしょうか? 勝率は「勝った試合数÷(勝った試合数+負けた試合数)*100」で計算。 上のデータでいうと、下記の順番です。 1 勝率100% チームC 2 勝率50% チームB 3 勝率0% チームD こちらは不可能でしたら構いません。 ご存知の方いらっしゃいましたらご教示ください。 よろしくお願いします。

    • ベストアンサー
    • 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、ホームのスタメン、ホームのサブ、アウェイのスタメン、アウェイのサブ として作ることを考えていたのですが、いかがでしょうか? 一番効率がよく早く出来る方法を教えていただけないでしょうか? 宜しくお願いします。

  • サッカーのホームアンドアウェー式について

    サッカーのホームアンドアウェー式ではアウェーでの得点が倍になると聞きましたが、2試合とも試合に負けたとしても、アウェーでの得点が多く総得点で勝っていれば勝ちになるのでしょうか?

  • 重複しないデータの抽出について

    MYSQL5.0.77で DBをつくり テーブル1のAフィールドのデータから テーブル2のAフィールドのデータ、 テーブル3のAフィールドのデータ、 テーブル3のAフィールドのデータ、 のいずれにも重複しないデータのみ 抽出したいと思っています。 どのようなSQL文を書けばよいでしょうか? じぶんでいろいろ試しましたがどうしても出来ません。 どなたかご教授願います。

    • ベストアンサー
    • MySQL
  • 抽出条件に応じてテーブルを作り分ける方法

    抽出条件テーブル(a)があり、抽出条件が参照するテーブル(b)がある。(a)には複数の抽出条件が登録され、(a)を参照しつつ、(b)から抽出されるテーブル(c)を抽出条件に応じて複数作成したい。つまり、(a)に登録された抽出条件の数だけテーブル(c)が作成される。 これをクエリで実行できる方法をご教示願いたい。 なお、(b)からデータを抽出する場合、上記の抽出条件テーブル(a)に代えて、クエリ内に抽出条件を20~30個記述する方法でも可。 Access2010を使用しています。VBAは使用しません。

  • 配列の抽出

    たびたび失礼します 以下のようなプログラムを記述しました private String[] setWorst(String[] score,String[] score2,String[] score3){ //ソート Data[] Datas = new Data[score.length]; for(int i = 0; i < Datas.length; i++){ Data Data = new Data(); Datas[i] = Data; Data.score = Integer.valueOf(score[i]); Data.s_indicator = s_indicator[i]; Data.center = center[i]; } ScoreComparator scoreComparator = new ScoreComparator(); Arrays.sort(Datas,scoreComparator); //ワーストの抽出 ArrayList worst3 = new ArrayList(); public class Data{ Integer score; String score2; // String score2; // } public class ScoreComparator implements Comparator{ public int compare(Object o1, Object o2){ Data Data1 = (Data)o1; Data Data2 = (Data)o2; int result = Data1.score.compareTo(Data2.score); return result; } } 変数scoreを中心としたソートを作成しました。 次にscoreの値を読み込んで下位4つを抜き出してArrayList worst3に格納していきたいと思っています。 scoreには0~10の数字が入っていますので0~3を抜き出したいということです。 自分でもいろいろ試しましたが、なかなか良い考えが浮かばないので知恵を借りたいと思います。 ヒントやアイデアだけでも結構ですので、よろしくお願いします。

  • ホームでもアウェイでもない場合の呼び方

    こんにちは。また質問させてください。 セリエAにおいて(どこも同じかもしれませんが)、ホーム試合でもアウェイでもない、第三者チームのスタジアムでの試合をなんと呼ぶのでしょうか? それとも、特に呼び方はないのでしょうか。 どなたか教えてください(><)

  • 2つの条件からシート2に抽出

    シート1 A1は手入力D4手入力、H2は=D2&C2 担当者と週で検索して抽出する式を教えて下さい。何度もすみません。 上手く出来なくて1行しか抽出しないんです。 上記の表から1週目だったら、1週目の担当者のデータをシート2の表に抽出 週2だったら2週目の担当者データを抽出 A1・D1は手入力 A3は=IF(COUNTIF(Sheet1!D$2:D$1000,B$1)=0,"",MATCH($B$1&$D$1,Sheet1!$H$2:$H$1000,0)) 上記の様にシート2に表示したいんです。 細かく教えて下さい。何度やっても1行目のデータしか抽出しないんです。 A3=IF(COUNTIF(Sheet1!D$2:D$1000,B$1)=0,"",MATCH($B$1&$D$1,Sheet1!$H$2:$H$1000,0)) B3=IF($A3="","",IF(VLOOKUP($A3,Sheet1!$A$2:$H$1000,COLUMN(B1),0)="","",VLOOKUP($A3,Sheet1!$A$2:$H$1000,COLUMN(B1),0))) A4の2行目以降1になってしまって同じ物しか出ないんです。 Aの番号の抽出方法の式を教えて下さい。

  • 複数のデータ抽出条件について

     |nen  |kaisha|cust |seihin|code |qty |ctg | ------------------------------------------------- 1 |2004 |A   |AC  |ITEMA |1  |100 |2 | 2 |2004 |A   |AC  |ITEMA |2  |100 |1 | 3 |2005 |A   |AC  |ITEMA |1  |200 |1 | 4 |2005 |A   |AC  |ITEMA |2  |300 |2 |○ 5 |2004 |B   |BC  |ITEMB |1  |100 |3 | 6 |2004 |B   |BC  |ITEMB |2  |100 |2 | 7 |2005 |B   |BC  |ITEMB |2  |200 |1 |○ 8 |2005 |B   |BC  |ITEMB |1  |200 |2 | 9 |2004 |C   |CC  |ITEMC |2  |200 |2 |○ 10 |2004 |C   |CC  |ITEMC |1  |100 |1 | KEY:nen,kaisha,cust,seihin,ctg DB:Oracle 上記テーブルから、「ctg」項目の値を抽出する時、 以下の条件で抽出したいと考えています。 条件:nendo=2004,2005 kaisha、cust、seihinが同一のデータがある場合、 ・nen=2004のqtyの値が大きいものを抽出する。 ↓1件に絞り込めない場合、 ・nen=2005のqtyの値が大きいものを抽出する。 ↓1件に絞り込めない場合、 ctgが小さいものを抽出する。 (上記表の○データを抽出したいと考えています) PL/SQLで上手くデータを抽出する方法はありますでしょうか? 何度も考えて見たのですが、上手くいきません でした・・・。ご教授頂けましたら嬉しいです。 宜しくお願い致します。