2016-12-28 11 views
2

以下このクエリ:このmysqlクエリを修正して勝率を表示するにはどうすればよいですか?

SELECT member, count(*) Wins 
FROM (SELECT player2_name as member from results 
WHERE player1_id = 2 AND player1_result = 'W' AND community_id = 16 
UNION ALL SELECT player1_name FROM results WHERE player2_id = 2 
AND player2_result = 'W' AND community_id = 16) AS T 
group by member ORDER BY Wins DESC 

は、次のような結果が生成されます。データをより便利にするために

+---------+-----------+ 
| member | Wins | 
+---------+-----------+ 
| Player 1|  4  | 
| Player 2|  3  | 
| Player 3|  3  | 
+---------+-------------+ 

(各プレイヤーがゲームの異なる数を果たしていることのように)私が表示したいです余分な列の '勝率'。

- >これは、各プレイヤーがプレイしたゲームの数に基づいています。私は期待していた

+---------+-----------+---------------+---------+ | member | Wins | Games Played | Win % | +---------+-----------+---------------+---------+ | Player 1| 4 | 8 | 0.50 | | Player 2| 3 | 3 | 1.00 | | Player 3| 3 | 5 | 0.60 | +---------+-----------+---------------+---------+

: - %を出力すると、MySQLの中で直接可能でないならば、小数点以下は、どのように私は以下のように出力を生成するために、私の既存のクエリを修正することができ0.76

すなわち罰金だろう

SELECT GamesPlayed FROM (SELECT player1_name as member from results 
WHERE player1_id = 2 AND community_id = 16 
UNION ALL SELECT player2_name FROM results WHERE player2_id = 2 
AND community_id = 16) AS GP 

して、1行目に:ただの線に沿って何かを追加する

SELECT member, count(*) Wins, round(sum(wins/GamesPlayed(1),2) WinPercentage 

しかし、それは私がそれがどのように動作するかを見て非常に大まかな希望を推測する。

最新のテストデータ:このような enter image description here

+0

あなたはまだあなたのデータベーススキーマを変更することはできますか? 「ゲーム」(参加者1人につき1つ)あたり2つのレコードを持つテーブルは、扱いやすくなります。 – Mr47

+0

私はできますが、私は好きではないでしょう... – RDowns

答えて

2

何か?

更新クエリ

SELECT 
    T.member 
    , count(*) Wins 
    , total.gamesPlayed 
    , count(*)/total.gamesPlayed as winPercentage 
FROM 
    (
     SELECT 
      player2_name as member 
     from results 
     WHERE 
      player1_id = 2 
      AND player1_result = 'W' 
      AND community_id = 16 
     UNION ALL 
     SELECT 
      player1_name 
     FROM results 
      WHERE player2_id = 2 
      AND player2_result = 'W' 
      AND community_id = 16 
    ) AS T 
    , (
      select 
       u.member 
       , sum(u.gamesPlayed) as gamesPlayed 
      from 
       (
        select 
         player2_name as member 
         , count(*) gamesPlayed 
        from results 
        where 
         player1_id = 2 
         AND community_id = 16 
        group by player2_name 
        union 
        select 
         player1_name as member 
         , count(*) gamesPlayed 
        from results 
        where 
         player2_id = 2 
         AND community_id = 16 
        group by player2_name 
       ) as u /* union of two */ 
      group by member 
    ) as total 
where 
    T.member = total.member 
group by T.member 
ORDER BY Wins DESC 
+0

Leeさん、ありがとうございます。これは31行目にエラーが表示されています。#1064 - SQL構文にエラーがあります。あなたのMySQLサーバのバージョンに対応するマニュアルをチェックしてください。 'count(*)'の近くで使用するためには、gamePlayed 結果から ここで '行31 – RDowns

+0

残念ながら、31行目と40行目の2つのカンマを忘れました(サブクエリ「u」内の(*) ')。私はあなたのテーブルを持っていないので、私は他の軽微な構文エラーがあるかもしれないので、私はクエリを実行することはできませんが、うまくいけば私のクエリはあなたに合計を見つける方法をいくつか考えを与えることができ、そこからクエリを取ることができます。 – leeyuiwah

+0

ほとんどそこに間違ったプレーヤーのための間違ったデータを与えています - 私は説明するスクリーンショットをアップロードします。 スルタンについてのプレイは4でなければならず、Gに対するgamesPlayは1でなければなりません... – RDowns

関連する問題