皆さんおはようございます、こんにちは、こんばんは.REDです。私はGUIツールは勿論
データベースもプログラムも、いまだに初心者です。無論プログラムなどは
コピペプログラマーですので、人に何か教えれる立場にないことも理解しています。
しかし、この記事をご覧になっている馬券師の方も私と同じように競馬ソフトを
作成してみたいという初心者の方が居るかも知れません。
私も壁に当たりましたが、初心者が競馬ソフトを作成するのには壁があるように思います。
正しい伝え方なのかは自信がありませんが、「データベースがあっても何をすればいいか分からない。」という方のお力になれればという思いで、恐れずこの記事を書くことにしました。不備などあればご指摘いただけると嬉しいです。
Contents
競馬ソフトを作成する時に感じる壁
さて、初心者が競馬ソフトを作成するには次のような壁があります。
- GUIツールの使い方を勉強する
- そもそもリレーショナルデータベースって何?
- MySQLのルールや関数、使い方などを勉強する
- ソフト化する時に必要なC#などの勉強
- JRA-VANの仕様書とにらめっこ
- その他、1つ1つ、色々勉強
全て理解しなくてもいいのですが、データを弄れるようになるまで
それ相応の時間が必要になると思います。
私には、これが結構な壁となりました。
私はせっかちです。カンニングしながら物を覚えるタイプです。
ですので、この記事はデータベースの勉強を始めたばかりの私に見せてやりたい
内容に仕上げたいと思います。長文になると思いますが、お付き合いください。
データベース初心者の馬券師がこの記事を見て、
「なんだデータベース簡単だな」って思って頂けるように お届けします!
リレーショナルデータベースとGUIツール
では、早速簡単な出馬表を作っていきましょう。
データベース構築は済みましたね?
まだだという方は、先にデータベース構築・データの取り込みを行ってください。
GUIツールの使い方
GUIツールを起動させてください。A5:SQL Mk-2で説明します。

- pckeibaをクリックし、データベースログインしてください。
- ここをクリックすればテーブルが開きます。(今は飛ばします)
- localhost / pckeibaを選択してください。
- リレーショナルデータベースのアイコンをクリックしてください。
クエリデザイナの新しいウインドが開きましたね?

- pckeibaをダブルクリックしてください。
- Tablesをダブルクリックしてください。
- テーブル一覧が表示されます。
- テーブルをドラッグアンドドロップさせた状態
リレーショナルデータベースの意味
では、テーブル一覧の中から
- jvd_race_shosai
- jvd_umagoto_race_joho
を4の画面にドラッグアンドドロップして表示させてください。
表示させましたら
jvd_race_shosai の RACE_CODE と
jvd_umagoto_race_joho の RACE_CODE を
リレーション(接続)してください。
ドラッグアンドドロップで接続できます。
テーブルとテーブルを接続する = これがリレーションデータベースといわれる理由です。
出馬表に必要なテーブルを用意する
以下のテーブルを探して4にドラッグアンドドロップしてください。
やり方は分かりますよね?
以下の画像の状態にリレーションしてください。

- jvd_race_shosaiのRACE_CODEと
jvd_umagoto_race_johoのRACE_CODEをリレーションします。 - jvd_umagoto_race_johoのSEIBETSU_CODEと
jvd_seibetsu_codeのCODEをリレーションします。 - jvd_race_shosaiのRACE_CODEと
jvd_bataijuのRACE_CODEをリレーションします。 - jvd_umagoto_race_johoのUMABANと
jvd_bataijuのUMABANをリレーションします。 - jvd_umagoto_race_johoのKETTO_TOROKU_BANGOと
jvd_kyosoba_masterのKETTO_TOROKU_BANGOをリレーションします。
次に、必要な情報にチェックを入れていきます。以下の画像の状態にしてください。

順番にチェックを入れてください。
- jvd_umagoto_race_joho の WAKUBAN
- jvd_umagoto_race_joho の UMABAN
- jvd_seibetsu_code の CONTENT
- jvd_umagoto_race_joho の BAREI
- jvd_umagoto_race_joho の BATAIJU
- jvd_bataiju の BATAIJU
- jvd_umagoto_race_joho の ZOGEN_FUGO
- jvd_bataiju の ZOGEN_FUGO
- jvd_umagoto_race_joho の ZOGEN_SA
- jvd_bataiju の ZOGEN_SA
- jvd_umagoto_race_joho の BAMEI
- jvd_umagoto_race_joho の FUTAN_JURYO
- jvd_umagoto_race_joho の KISHUMEI_RYAKUSHO
- jvd_umagoto_race_joho の CHOKYOSHIMEI_RYAKUSHO
- jvd_umagoto_race_joho の BANUSHIMEI_HOJINKAKU_NASHI
- jvd_kyosoba_master の KETTO1_BAMEI
- jvd_kyosoba_master の KETTO2_BAMEI
GUIツールのありがたさ
GUIツール A5:SQL Mk-2のありがたさを分かってもらえると思います。
SQLタブを選択してください。

リレーションして必要な情報にチェックを入れるだけで、
A5:SQL Mk-2がSQL文を書いてくれます。(教えてくれます。)
GUIツールすげぇ~~~! A5:SQL Mk-2の作者matsuさんに感謝です!
SQL文のいろいろ解説
自分でSQL文を書かなくても基本的なSQL文が作れてしまうのが分かれば、ハードルはかなり低くなりますね。次にSQL文の簡単な説明をします。ここまでの作業が間違えていなければ、SQL文は次のようになっているはずです。
SELECT
pckeiba.jvd_umagoto_race_joho.WAKUBAN
, pckeiba.jvd_umagoto_race_joho.UMABAN
, pckeiba.jvd_seibetsu_code.CONTENT
, pckeiba.jvd_umagoto_race_joho.BAREI
, pckeiba.jvd_umagoto_race_joho.BATAIJU
, pckeiba.jvd_bataiju.BATAIJU AS BATAIJU1
, pckeiba.jvd_umagoto_race_joho.ZOGEN_FUGO
, pckeiba.jvd_bataiju.ZOGEN_FUGO AS ZOGEN_FUGO1
, pckeiba.jvd_umagoto_race_joho.ZOGEN_SA
, pckeiba.jvd_bataiju.ZOGEN_SA AS ZOGEN_SA1
, pckeiba.jvd_umagoto_race_joho.BAMEI
, pckeiba.jvd_umagoto_race_joho.FUTAN_JURYO
, pckeiba.jvd_umagoto_race_joho.KISHUMEI_RYAKUSHO
, pckeiba.jvd_umagoto_race_joho.CHOKYOSHIMEI_RYAKUSHO
, pckeiba.jvd_umagoto_race_joho.BANUSHIMEI_HOJINKAKU_NASHI
, pckeiba.jvd_kyosoba_master.KETTO1_BAMEI
, pckeiba.jvd_kyosoba_master.KETTO2_BAMEI
FROM
pckeiba.jvd_race_shosai
INNER JOIN pckeiba.jvd_umagoto_race_joho
ON pckeiba.jvd_race_shosai.RACE_CODE = pckeiba.jvd_umagoto_race_joho.RACE_CODE
INNER JOIN pckeiba.jvd_seibetsu_code
ON pckeiba.jvd_umagoto_race_joho.SEIBETSU_CODE = pckeiba.jvd_seibetsu_code.CODE
INNER JOIN pckeiba.jvd_bataiju
ON pckeiba.jvd_race_shosai.RACE_CODE = pckeiba.jvd_bataiju.RACE_CODE
AND pckeiba.jvd_umagoto_race_joho.UMABAN = pckeiba.jvd_bataiju.UMABAN
INNER JOIN pckeiba.jvd_kyosoba_master
ON pckeiba.jvd_umagoto_race_joho.KETTO_TOROKU_BANGO = pckeiba.jvd_kyosoba_master.KETTO_TOROKU_BANGO

上記のSQL文の画像に、それぞれ色を付けました。
- 選択した情報
- 基になるテーブル
- テーブル同士を接続するリレーション
のSQL文になります。
SQLを実行してみよう
では、実際に作ったSQLを実行してみましょう。
実行タブを選択し、緑のPLAYアイコンをクリックしてください。

SQLの実行結果が表示されました。
ただ、このままでは全てのデータが表示されてしまい、出馬表としては使いにくいですね。
日付・競馬場・レース番号を指定してみましょう。
SQLタブを選択し、以下のSQL文を 末尾に追加してください。
WHERE 1 = 1
AND pckeiba.jvd_race_shosai.KAISAI_NENGAPPI = '2015-07-05'
AND pckeiba.jvd_race_shosai.KEIBAJO_CODE = '02'
AND pckeiba.jvd_race_shosai.RACE_BANGO = '11'
ORDER BY pckeiba.jvd_umagoto_race_joho.UMABAN ASC

- WHERE 1 = 1 :取得するデータを選択しているSQL文
- ORDER BY:ASCで馬番順に並べ替えをしているSQL文
SQL文を追加したら、再度SQLの実行をしてみましょう。
2015年7月5日、函館競馬場、11レースのデータのみ表示されたと思います。
SQL文を簡潔にしよう
慣れてくるとterapadなどで一括置き換えできますが、SQL文に慣れるのが目的なので
理解できるまでは手作業で行ってください。
HTMLと同じで、自然と理解できるようになります。
SQL文から pckeiba.を全て削除してください。
pckeiba.はデータベースの名前なので必要ありません。
早く理解する為にも、自分で見やすいようにSQL文を並べ替えてください。
今後の為にも、敢えてコピペできるコードは張りません。
時間が掛かっても上記の2つを行ってください。以下のようになるはずです。

これで少しSQL文が見やすくすっきりしましたね。
では、再度SQLを実行してみてください。
正しく書けていないとエラーが出ますので、エラーが出たら悪いところを修正してください。
SQL文が正しければ、必ずデータが表示されるはずです。
さらに SQL文を簡潔にしよう
これを繰り返し行うことで、SQLの理解は加速します。
SQL文を読みやすくすることでSQL文を改造?しやすくなりますし、
簡単なSQL文なら手打ちで行うことができるようになります。
FROM から INNER JOIN までを下記に張り替えてください。
FROM jvd_race_shosai RA
INNER JOIN jvd_umagoto_race_joho UM ON jvd_race_shosai.RACE_CODE = jvd_umagoto_race_joho.RACE_CODE
INNER JOIN jvd_seibetsu_code SC ON jvd_umagoto_race_joho.SEIBETSU_CODE = jvd_seibetsu_code.CODE
INNER JOIN jvd_bataiju ON BT jvd_race_shosai.RACE_CODE = jvd_bataiju.RACE_CODE AND jvd_umagoto_race_joho.UMABAN = jvd_bataiju.UMABAN
INNER JOIN jvd_kyosoba_master KM ON jvd_umagoto_race_joho.KETTO_TOROKU_BANGO = jvd_kyosoba_master.KETTO_TOROKU_BANGO

今回追加したのは四角で囲まれた部分です。
線を引いた部分はそのままに、その他のテーブル名を全て
四角で囲まれたテーブル名に変更してください。
- jvd_race_shosai は全て RAに
- jvd_umagoto_race_joho は全て UMに
- jvd_seibetsu_code は全て SCに
- jvd_bataiju は全て BTに
- jvd_kyosoba_master は全て KMに
書き換えが終わりましたら、SQLを実行してください。
間違いがなければデータが表示されるはずです。(・∀・)ニヤニヤ
スッキリしたSQL文
これでSQL文は、かなりスッキリと見やすいものに変わりましたね。

どうですか?SQLを実行して、ちゃんとデータが表示されましたか?
何?エラーばかり出る?おかしいなー・・・って、
それもそのはず。先ほどコピペしてもらったSQL文には1つ間違いがあります。
どこだか分かりますか?
(゚皿゚)_┳※・・・・・・・・・・ターン・・・・・・・・(;゚ロ゚)ヒー・・・・・・・・・・・⊃
ヒー! すみませんすみません。BTの位置が ONの後ろに来てますよね。
前に持ってくれば動くはずです。
いや、もうね、今更だけど何でこんな面倒くさい記事書き出したんだろうと・・・
やってらんねーなと(笑)
見る人も馬券のことや競馬のことなら楽しんでもらえるかもしれないけど、
ブログ書き始めてから、ずっとクソつまんねーデータベースの構築やら、
誰が興味あんねんって思ってね(笑)とほほ
文字列を結合しよう
気を取り直しまして、表示されたデータの性別と馬齢をひとまとめにしてみましょう。
SC.CONTENT,
UM.BAREI,
//上記のSQL文を結合させるSQL文↓
CONCAT(SC.CONTENT, CAST(UM.BAREI AS CHAR)),
CONCATと CASTはGoogle先生に聞いてください。
どちらかのデータを表示させる
表示されたデータの中に、馬体重が2つ・増減符号が2つ・増減が2つありますよね?
このデータは
- 金曜日の段階では、両方データが無い状態
- 土曜日、日曜日の段階では、速報系データにだけデータがある状態
- 月曜日になれば、通常データのものを利用する状態
だからです。
PC-KEIBAの速報系データのダウンロードタブに、今週の開催データのみ保存するにチェックがあれば、月曜日の段階でも、通常データ・速報系データ両方が保存されるのですが、2000年(昔の)などの馬体重は、速報系データを取得することはできません。ですので、データがあるほうからデータを表示させるようにします。何言ってるかわかります?^^;
UM.BATAIJU,
BT.BATAIJU AS BATAIJU1,
//上記のSQL文を下記に書き換えてください↓
CONCAT(COALESCE(CAST(BT.BATAIJU AS CHAR), CAST(UM.BATAIJU AS CHAR)), ' kg'),
- CONCATで馬体重と kgを結合させています。
- COALESCEで、引数の最初の非NULL値を返します。
- 非NULL(両方にデータが無い)場合NULLを返します。
つまりBT.BATAIJU・UM.BATAIJUのどちらかにデータがあれば、データが表示されます。 - CASTで、ほにゃららです。(さっき調べたでしょ?( ´△`)
後は、増減符号と増減も同じようにしてください。
見出しに名前を付ける
最後に分かりやすい名前を見出しに付けましょう。
今回は分かりやすく日本語で付けてみますが、環境によって文字化けする可能性があるので
基本的にはローマ字で名前を付けるほうがいいみたいです。
UM.WAKUBAN AS 枠,
全てのデータの後に、AS ●●,を追加してください。以下の画像のようになるはずです。

この記事のまとめ
説明を優先して、途中リレーションを一気に行っていますが、
通常は1つリレーションさせたら1つ必要なデータをチェックし、
SQLが正常に動くかどうか実行(確認)しながら
必要なデータを増やしていくと良いでしょう。
プロの方から見れば稚拙で分かりにくい長文になってしまった部分は否めませんが、
何からやったら良いのかが分からないという初心者の方に、
なんとなくでも流れが分かったと思っていただけたら幸いです。
全て理解する必要はありません!色々いじってたら大丈夫!
あと、JRA-VANの仕様書はコピーして何度も見直してください。
これだけはどうしようもありません。
よし!しばらくはブログ書かないぞ!(笑)
コメント
初めまして、makugaiberと申します。
今この記事を出てる出馬表を真似てmysqlを使い出馬表を作っているのですが、日付、競馬場、レースを指定する所で、下記のエラーが出てしまいます。
SQL : SELECT
pckeiba.jvd_umagoto_race_joho.WAKUBAN
, pckeiba.jvd_umagoto_race_joho.UMABAN
, pckeiba.jvd_seibetsu_code.CONTENT
, pckeiba.jvd_umagoto_race_joho.BAREI
, pckeiba.jvd_umagoto_race_joho.BATAIJU
, pckeiba.jvd_bataiju.BATAIJU AS BATAIJU1
, pckeiba.jvd_umagoto_race_joho.ZOGEN_FUGO
, pckeiba.jvd_bataiju.ZOGEN_FUGO AS ZOGEN_FUGO1
, pckeiba.jvd_umagoto_race_joho.ZOGEN_SA
, pckeiba.jvd_bataiju.ZOGEN_SA AS ZOGEN_SA1
, pckeiba.jvd_umagoto_race_joho.BAMEI
, pckeiba.jvd_umagoto_race_joho.FUTAN_JURYO
, pckeiba.jvd_umagoto_race_joho.KISHUMEI_RYAKUSHO
, pckeiba.jvd_umagoto_race_joho.CHOKYOSHIMEI_RYAKUSHO
, pckeiba.jvd_umagoto_race_joho.BANUSHIMEI_HOJINKAKU_NASHI
, pckeiba.jvd_kyosoba_master.KETTO1_BAMEI
, pckeiba.jvd_kyosoba_master.KETTO2_BAMEI
FROM
pckeiba.jvd_race_shosai
INNER JOIN pckeiba.jvd_umagoto_race_joho
ON pckeiba.jvd_race_shosai.RACE_CODE = pckeiba.jvd_umagoto_race_joho.RACE_CODE
INNER JOIN pckeiba.jvd_seibetsu_code
ON pckeiba.jvd_umagoto_race_joho.SEIBETSU_CODE = pckeiba.jvd_seibetsu_code.CODE
INNER JOIN pckeiba.jvd_bataiju
ON pckeiba.jvd_race_shosai.RACE_CODE = pckeiba.jvd_bataiju.RACE_CODE
AND pckeiba.jvd_umagoto_race_joho.UMABAN = pckeiba.jvd_bataiju.UMABAN
INNER JOIN pckeiba.jvd_kyosoba_master
ON pckeiba.jvd_umagoto_race_joho.KETTO_TOROKU_BANGO = pckeiba.jvd_kyosoba_master.KETTO_TOROKU_BANGO
WHERE 1 = 1
AND pckeiba.jvd_race_shosai.KAISAI_NENGAPPI =’2015-07-05′
AND pckeiba.jvd_race_shosai.KEIBAJO_CODE = ’02 ‘
AND pckeiba.jvd_race_shosai.RACE_BANGO = ’11’
ORDER BY pckeiba.jvd_umagoto_joho.UMABAN ASC
SQL : #42S22Unknown column ‘pckeiba.jvd_umagoto_joho.UMABAN’ in ‘order clause’
長文で失礼します。
mysqlは初心者なのでどう直せばいいのか分からないので出来たらご助言を宜しくお願いします。
makugaiberさん初めまして。当サイトを参考にしていただき、ありがとうございます。
>mysqlは初心者なのでどう直せばいいのか分からないので出来たらご助言を宜しくお願いします。
エラーが出ている場所はどこですか?ちゃんと確認しましょう。
SQL : #42S22Unknown column ‘pckeiba.jvd_umagoto_joho.UMABAN’ in ‘order clause’の後に
at line33と出てるはずです。ということは33行目にエラーが出ているのでそこを見直されてください。
自己解決ができない時、答えを教えてもらうのは近道に感じるものですが、理解からは遠ざかります。
トライ&エラーを繰り返し「やりたいことの実現」の為に自己解決を心がけてください。
それが遠回りのように感じて実は一番の近道になります。文章にすると何か偉そうですね^^;
すみません。
がんばってください!
ご返信ありがとうございます。
最後の行のraceが抜けていました。
そこを直せたのですが、今度はデータがNULLというのが出ました。
調べては見たのですが、また分かんなくなったので再度で何か心当たりがあったら教えてくれませんか。
お手数をお掛けします。
この記事自体が答えになっていませんか?
Red 様
当方、投資競馬を模索するものですが、
プログラムを組むほどの元気はありません。
単勝多点でココモ法で追い上げのプログラム
って簡単に作れますか?
現在市販を含めて色々探していますが、適切なのが
見つからないのが現状です。
北極星さんコメントありがとうございます。
やりたいことのイメージが掴めないので、勝手にイメージしますね。
まず単勝多点買いですが、それぞれの馬に順位を付けて1位~3位を買う。
これは可能ですし、簡単だと思います。
自動で単勝3点100円買いスタート
↓
外れたら200円ずつ買う
↓
当たった(2位)
↓
1位400円・2位100円・3位400円で自動で買う
このような自動投票をお考えなら私は出来ませんし、お勧めもできません。
私はこれで破綻した経験があります。
100円スタートで15回外したら16回目の資金は幾ら必要か?
平日の午前の単勝の売り上げご存知ですか?
>現在市販を含めて色々探していますが、適切なのが見つからないのが現状です。
それが答えだと思います。
.Red様
貴重なブログ、有難く拝見させて頂いております。
ブログに従い、二度ほどゼロベースからやり直してみましたが、
この「出馬表」作成にあたり、完全に行き詰ってしまいました。
具体的には、GUIで作成したSQLの実行結果(=出馬表)のコンテンツが全て「NULL」になる。
①データベース(中身)の構築に失敗
②データベースとMySQLの連携に失敗
その何れかではないかと思います。
①はJRA-VANのDVDよりフルセットアップ済
取得済データ セットアップデータ:2,249件
通常データ:1,397件
②は同PC-KEIBA Databaseにて接続テスト確認済
MySQLのバージョンは5.6
素人すぎる質問でお手数をおかけしますが
皆目 糸口が掴めません。
思い当たる節など、何かアドバイス頂ければ幸いです。
よろしくお願いいたします。
worlitzさんコメントありがとうございます。
まず、GUIで、データが登録されているか確認してください。
GUIツールの使い方の画像の2番のpckeibaをダブルクリック→JVD_RACE_SHOSAIをダブルクリック
>GUIで作成したSQLの実行結果(=出馬表)のコンテンツが全て「NULL」になる。
データがあるのであれば、SQL文の間違いであると思います。
単純なSQL文の間違いなどありませんか?
新馬戦の前走などデータそのものが無ければNULLになります。
データがあるのに意図しないNULLの原因は
2.)MySQLに登録されていないデータを(例えば速報系データ)joinされていませんか?
3.)RA.KAISAI_NENGAPPI =’日付け指定’(データが無い日付を指定していないか?
他にも凡ミスは人の数だけあると思います。
同じような質問をいただくことが多いので、SQL文に慣れるまでのコツ的な記事が必要ですね。
上手く動くことを祈っています!
.Red様
お丁寧な返信ありがとうございます。
ご指南の通り、 “JVD_RACE_SHOSAI” の状況を確認してみました。
少なくともデータはある様子です。
ただし、
上記のSQL文(※GUIにて作成直後の “ばばーん” のオリジナル文)を、
クエリにコピペの上、実行したところ、
変わらず “WAKUBAN”始め、全てのセルが「(NULL)」(※1行のみ表示)になります。
尚、「このセットの実行計画の表示」には、
“SIMPLE (Impossible WHERE noticed after reading const tables)”
とのみ表示。
また、A5:SQL Mk-2 にデータベースを接続したときから気になっていたのですが、
各テーブルの右側にでる 緑字 が、ほぼ “????” と表示されています。
ご指摘の “JVD_RACE_SHOSAI” の内、tab「カラム」の “論理名” も同様。
tab「ソース」の冒頭からして、以下の通りの始末。
CREATE TABLE `jvd_race_shosai` (
`INSERT_TIMESTAMP` datetime DEFAULT NULL COMMENT ‘????’,
`UPDATE_TIMESTAMP` datetime DEFAULT NULL COMMENT ‘????’,
(以下略)
以上が、データベースの構築に失敗していないか心配になる要因です。
文字化けの可能性を考慮して、MySQLの文字セットを、
my.ini にて sjis に変更したところ、MySQL自身が起動しなくなりました。。
再インストールからやり直してみます。
長文で申し訳ありません。
色々調べて、自分なりに試行錯誤していますが、
また経験者として、改めてお気づきの点をお聞かせいただければ幸いです。
よろしくお願いいたします。