アプリ版:「スタンプのみでお礼する」機能のリリースについて

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

こちらは不可能でしたら構いません。

ご存知の方いらっしゃいましたらご教示ください。
よろしくお願いします。

A 回答 (3件)

自分目線であればそんな感じの管理なんでしょうね



さて命題の件は

//仮データ
create table game(issue varchar(10),h_a varchar(10),h_score int,a_score int,opponent varchar(20));
insert into game values(
'●','H','8','9','チームB'),(
'○','A','2','8','チームC'),(
'●','H','4','9','チームD'),(
'○','A','3','4','チームB'),(
'●','H','0','1','チームB'),(
'△','A','3','3','チームC'),(
'△','H','1','1','チームE');
として(集計結果をみるためすこしデータいじってます)

(1)
select (h_a='H')*h_score + (h_a='A')*a_score as score ,issue,opponent from game order by score desc;


(2)
select opponent,coalesce(sum(issue='○')/(sum(issue='○')+sum(issue='●')),0) as ratio
from game
group by opponent
order by ratio desc;

となります。ポイントは

>勝率は「勝った試合数÷(勝った試合数+負けた試合数)*100」

とする場合、引き分けしかない相手をどうするかですね
いわゆる勝ち点方式のように引き分けも評価対象にしないと
引き分けが多いチームとの力関係が相対評価できないと思います
今回はcoalesce関数で引き分けだけの関係は負けと同等としています

また、自分がホームかアウェーかわかっていてそれぞれの点数がわかっているので
issueとダブルバインドしている点が気になります。
最初の書き込みでうっかり間違えたとおり、issueによる勝ち負けと
点数によって勝ち負け判断の整合性があわなくなる場合もあり、
何をもって勝ち負けをジャッジするか決めておかないと計算があわなくなります。
    • good
    • 0
この回答へのお礼

yambejpさん

再度回答ありがとうございます。

ご教示頂いたコードで実行したら無事理想通りの結果が表示されました。ありがとうございます。
勝率についてはSQL文では不可能かなと思っていたので驚きました。

>とする場合、引き分けしかない相手をどうするかですね

ここまで深く考えていませんでした。
どのようにするか少し考えてみます。

>また、自分がホームかアウェーかわかっていてそれぞれの点数がわかっているので
issueとダブルバインドしている点が気になります。

そうですね。issueは時折まとめてチェックはしているもの間違いも多々あります。
こちらについてももう少し考えてみます。

とても勉強になりました。
ありがとうございました。

お礼日時:2014/07/01 18:03

データ管理が微妙なんですが



これは自分のチームが対戦した結果だけ保存していけばいいという仕様ですか?
たとえばチームBとチームCが対戦した結果などはどうでもいい?
    • good
    • 0
この回答へのお礼

yambejpさん

回答ありがとうございます。

申し訳ありません、私の説明不足でした。
自分のチーム(チームA)視点でデータを格納しています。
なので仰る通りチームBとチームCの対戦結果などは除外しています。

あと一点。質問を書き込んでから気付いたのですが、データの最後は引き分けですね。

○|A|3|3|チームB

△|A|3|3|チームB

よろしくお願いします。

お礼日時:2014/07/01 16:16

一点目はこんな感じ。



SELECT *, CASE h_a WHEN 'H' THEN h_score ELSE a_score END AS score FROM game ORDER BY score DESC LIMIT 10;
    • good
    • 0
この回答へのお礼

t_ohtaさん

回答ありがとうございます。

先ほどご教示頂いたコードで試したら無事できました。
助かりました。ありがとうございます。

やはり二点目はSQL文でどうこうできる問題ではないのでしょうか?
詳しい方に無理だと言われれば諦めつくのですが。

よろしくお願いします。

お礼日時:2014/07/01 16:28

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

関連するカテゴリからQ&Aを探す