JRA-VANのレース情報をMySQLに取り込んで使う

血統表検索サイトリニューアルのためにJRA-VANを使い始めたので、その備忘録と情報共有。

### 本稿の目的

- JRAのレース結果と特別登録馬をJRA-VANから入手し、MySQLデータベースに取り込んでWebアプリから利用する
- オッズや調教の状況などその他データに関しては本稿では記載しない

## JRA-VANとは

主にJRAのレース情報などを配信するサイトである。
いくつかの提供サービスがあるが、データを取り込んで使うにはJRA-VAN DataLab.（データラボ）（https://jra-van.jp/dlb/） というサービスを使用する。会員になるとこの情報を使ったアプリがいろいろ使える。TARGETという統合的なアプリがおすすめされているが、利用していない。アプリについては後述の2つのみを使用している。

### データラボで取得できる情報

- 当日のレース情報（馬番、枠順、馬名など）
- 過去のレース結果（馬番、枠順、馬名など）
- 現在、過去のオッズ
- 次週の特別登録馬
- 競走馬に関する情報（血統も含む）
- 調教の状況
- 騎手に関する情報

など。レース結果と登録馬情報以外のオッズ、調教などに関する情報は今のところ全く使用していないので、中身についてはよくわからない。

### 月額料金

月額費用は2,090円（税込）。3ヵ月で 6,270円（税込）12ヶ月 25,080円（税込）と、まとめて払ったからといって、割引は全くない。

## データをDBに取り込む

JRA-VANから提供されているデータは謎のテキストデータ（直接見ていないので正確なことは不明）なので、これをMySQLに取り込む必要がある。検索して出てきたツールが以下の2つ。どちらもWindows専用。手元にある低スペックなWindows11を使ったが動作には問題なかった。

### 取り込みアプリ1 EveryDB2 2.3

https://jra-van.jp/dlb/sft/lib/everydb.html

さまざまなDBに対応している。SQLiteがデフォルト。まずSQLiteへの取り込みを試してみたが、ファイルが20Gになった時点で何か間違っているのではないかと思い中断。
MySQLでも試してみたが、待ち時間が長いのに何も返答がないのでちょっと初心者には辛い。

### 取り込みアプリ2 mykeibadb　3.3

https://jra-van.jp/dlb/sft/lib/mykeibadb.html

次にmykeibadbというアプリを使った。mykeibadbというコマンドラインツールとwmykeibadbというヘルパーアプリのセット。MySQLとPostgresSQLに対応している。現在はこちらを使用している。

### wmykeibadbによる設定

wmykeibadb.exeを起動すると画面が起動し、データベースの設定と取得するデータの選択が行える。取り込むデータはチェックで選べる。
筆者は念のため三連単のデータ、速報データを除いたものをすべて取り込んだが、三連単以外も使わない情報は取り込む必要がなかった気もする。

![スクリーンショット 2025-02-10 0.56.23.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/547510/81d0c253-8809-601f-7d8d-1cde8b50957c.png)

### mykeibadbの実行

設定が終わり「mykeibadb実行」ボタンをクリックすると、JRA-VANからデータを取り込んでMySQLサーバーに放り込んでくれる。

「セットアップ有」にチェックしないと過去1年分くらいしかデータを取り込んでくれないので注意が必要だ。

なお、「セットアップ有」を選ぶとJRA-VANから送られてきたCDを使って取り込むことができる。筆者は数年前にもらったはずだったのだが紛失してしまい非常に後悔している。

取り込みは筆者環境ではまる3日かかかった。環境によって違いがあるのかもしれないが今のところもう一度やる予定はないので永遠の謎だ。CDがあればどれくらい短縮できたのだろう。

データ量は本当に巨大。三連単の票数情報を除いて一番大きいのが「馬毎レース情報」という各レースのそれぞれの競走馬に関する情報。着順や、馬名、騎手など以外に道中の位置取りのような詳細な情報が含まれている。250万件くらいある。

EveryDB2で最初に取り込んだときは何も考えておらず三連単のデータも含んでいたため20Gあったのはあながち間違いではなかった気もする。（SQLite3でこの大きさ）

### テーブル内容と使用しているテーブル

テーブルは全部で76ある。オッズや票数など馬券に関するテーブルが20くらい、競走馬に関するテーブルが20くらい、IDと対応したマスタ情報が入ったテーブルが20くらいで、競走成績として実際に使うテーブルは少しだけだった。

#### レース情報のために使われているテーブル

レース情報更新のため日常的に直接参照しているテーブルは以下の4つ。mykeibadbで作成されているものなので、元のJRA-VANデータとの関連はよくわかっていない。

- RACE_SHOSAI

個別レースに関する情報

開催日の何レース、どの競馬場で距離はどれくらい、芝なのかダートなのかなど
通常の2場開催の週だと2×12×2 で48レコード増えることになる。
それにJRA馬が出走している地方競馬のレースに関する情報が追加されている。これが週に5〜20くらいある。

- UMAGOTO_RACE_JOHO

レースに出走したそれぞれの馬に関する情報

出走馬ごとの着順とか馬体重とか騎手とか位置取りとかがすべてここにある。

出走全馬の情報が追加されるので、1レースに16頭出走していると16レコードが増えることになる。
通常の2場開催の週だと、これ×48のレコード、平均600くらいレコードが毎週追加される。
出走確定時には馬番がない情報、出走前日には馬番が付いて着順などのない情報、出走後、火曜日までには着順や人気、位置取りなどのデータも追加されるので、随時置き換える必要がある。

- TOKUBETSU_TOROKUBA

レース情報とは別に、特別登録馬のテーブルがある。
これは日曜日の最終レースが終わった後に特別レースの情報と登録馬だけ先行して公開されるからだと思われる。2場開催だと

内容は RACE_SHOSAIテーブルと似ているのでわりとコードの使い回しがきく。

- TOKUBETSU_TOROKUBAGOTO_JOHO

こちらは次週の特別レースの登録馬情報。UMAGOTO_RACE_JOHOに似たようなものだと考えると良い。
    
### マスタテーブル

データテーブルに書かれている情報は、そのままだと数値で意味がわからない。それを解釈するため参照するマスタテーブル。

- CHAKUSA_CODE

着差（1馬身とか1 1/4 とかクビとかハナとか）

 - GRADE_CODE
 
重賞区分（G1/G2/G3/JG1/リステッドなど）

- IJO_KUBUN_CODE

異常時の区分コード。除外とか中止とかは順位00でIJO_KUBUN_CODEに値が入っているのでこれを参照する

- keibajo_code

競馬場コード 01-10 までがJRA。地方競馬場だけでなくフランスとかアメリカみたいなのもある

### レース情報を取得する

PHPでWebアプリと書くと言っても基本的にやることはSQLを実行することだ。こんなかんじでSQLを書くと必要なデータが取得できる。

- 2025年1月1日〜7日までのレース一覧と勝ち馬を取得する

```
SELECT 
    rs.KAISAI_NEN, 
    rs.KAISAI_GAPPI, 
    rs.KEIBAJO_CODE, 
    kc.JOMEI AS KEIBAJO_NAME, 
    rs.RACE_CODE, 
    rs.RACE_BANGO, 
    rs.GRADE_CODE, #グレード
    rs.KYOSOMEI_HONDAI, #競走名
    urj.BAMEI AS WINNING_HORSE,
    urj.BAREI AS AGE_HORSE,  #性別
    urj.SEIBETSU_CODE AS GENDER_HORSE, #馬齢
    urj.KISHUMEI_RYAKUSHO AS JOCKEY_NAME, #騎手名
    urj.CHOKYOSHIMEI_RYAKUSHO AS TRAINER_NAME, #調教師名
    rs.KYORI AS RACE_DISTANCE,
    tc.RYAKU AS TRACK_TYPE,
    kjc2.MEISHO AS KYOSO_JOKEN_CODE_2SAI_NAME,
    kjc3.MEISHO AS KYOSO_JOKEN_CODE_3SAI_NAME,
    kjc4.MEISHO AS KYOSO_JOKEN_CODE_4SAI_NAME,
    kkc.MEISHO AS KYOSO_KIGO_CODE_NAME,
    ksc.MEISHO AS KYOSO_SHUBETSU_CODE_NAME,
    urj.TANSHO_NINKIJUN AS POPULARITY,
    urj.TANSHO_ODDS AS ODDS
FROM race_shosai rs
    LEFT JOIN keibajo_code kc ON rs.KEIBAJO_CODE = kc.CODE
    LEFT JOIN umagoto_race_joho urj ON rs.RACE_CODE = urj.RACE_CODE AND urj.KAKUTEI_CHAKUJUN = '01'
    LEFT JOIN track_code tc ON rs.TRACK_CODE = tc.CODE
    LEFT JOIN kyoso_joken_code kjc2 ON rs.KYOSO_JOKEN_CODE_2SAI = kjc2.CODE
    LEFT JOIN kyoso_joken_code kjc3 ON rs.KYOSO_JOKEN_CODE_3SAI = kjc3.CODE
    LEFT JOIN kyoso_joken_code kjc4 ON rs.KYOSO_JOKEN_CODE_4SAI = kjc4.CODE
    LEFT JOIN kyoso_kigo_code kkc ON rs.KYOSO_KIGO_CODE = kkc.CODE
    LEFT JOIN kyoso_shubetsu_code ksc ON rs.KYOSO_SHUBETSU_CODE = ksc.CODE
WHERE rs.KAISAI_NEN = '2025' AND rs.KAISAI_GAPPI BETWEEN '0101' AND '0107'
```



![作成イメージ](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/547510/dcce5e7f-84d0-2708-0522-a1f2d6e3a01a.png)


ひとまずレース情報が取得できたのでよかった。

オッズや調教、血統、騎手などその他の情報に関してはまた別途まとめるかもしれない。
この一年で単勝期待値が一番高い騎手や競馬場ごとの平均単勝払戻みたいな情報も取得できたので、まだいろいろできることはあるのかもしれない。

### まとめ

- 取り込み時間さえ我慢さえできれば50年分くらいのJRAの過去レースに関するデータが手に入る。
- MySQLに変換できたらSQLで参照できるので非常に便利