2015-12-15 6 views
6

私の学校のピンポンスコアを記録するphpのウェブサイトを作成しています。現在、勝ったプレーヤーはWinnerID, LoserID, PointsFor, PointsAgainstを記録します。私は次の関係を持つ2つのテーブルを持っています。獲得ポイントの勝敗を計算するのに助けが必要

表:ユーザー

  • user_IDは(PK)
  • ユーザ名
  • エロ

表:ゲーム

  • game_id(PK)
  • WinnerID(FK )
  • LoserID(FK)
  • PointsFor
  • PointsAgainst

のphpファイルで私のINSERT文は次のとおりです。ここで

INSERT INTO games(WinnerID,LoserID,PointsFor,PointsAgainst) VALUES('$Winner_ID','$Loser_ID','$userscore','$oppscore')" 

は、私が試したものですが、それは表示されません。スコアは正しく。あなたは上の画像で見ることができるように

SELECT min(u.username) 'Username', COUNT(g.WinnerID) 'Wins', sum(g.PointsFor) 'Points For', sum(g.PointsAgainst) 'Points Against', u.Elo 'Ranking' 
from games g 
LEFT JOIN users u 
on g.WinnerID = u.user_id 
Group by g.WinnerID 

This is the select statement output

、合計に対するためのポイントとポイントが加算されません。現在のところ、勝者になった人の統計だけが表示されます。つまり、PlayerAが21-5を獲得した場合、それはselectステートメントから表示されますが、PlayerBは5-21のスコアを表示しません。どんな助けもありがとうございます。ページはスコアを入力するための

PHPコードは:

if(isset($_POST['btn-post'])) 
{ 
    $opponent = $_POST["opponent"]; 
    //$opponent = array_key_exists('opponent', $_POST) ? $_POST['opponent'] : false; 

    $userscore = mysql_real_escape_string($_POST['userscore']); 
    $oppscore = mysql_real_escape_string($_POST['oppscore']); 

    if($userscore != $oppscore) 
    { 
     if($userscore > $oppscore) 
     { 
      $Winner_ID = $_SESSION['user']; 
      $query = mysql_query("SELECT user_id FROM users WHERE username = '".$opponent."'"); 
      $result = mysql_fetch_array($query) or die(mysql_error()); 
      $Loser_ID = $result['user_id']; 

      $query1 = mysql_query("SELECT Elo FROM users WHERE user_id=".$_SESSION['user']); 
      $result1 = mysql_fetch_array($query1) or die(mysql_error()); 
      $winnerRating = $result1['Elo']; 

      $query2 = mysql_query("SELECT Elo FROM users WHERE user_id=".$Loser_ID); 
      $result2 = mysql_fetch_array($query2) or die(mysql_error()); 
      $loserRating = $result1['Elo']; 

      $rating = new Rating($winnerRating, $loserRating, 1, 0);    
      $results = $rating->getNewRatings(); 

      if(mysql_query("UPDATE users SET Elo = " . $results['a'] . " WHERE user_id=".$_SESSION['user'])) 
      { 

      } 
      else 
      { 
       ?> 
       <script>alert('There was an error while entering winners(user) ranking...');</script> 
       <?php 
      } 
      if(mysql_query("UPDATE users SET Elo = " . $results['b'] . " WHERE user_id=".$Loser_ID)) 
      { 

      } 
      else 
      { 
       ?> 
       <script>alert('There was an error while entering losers(opp) ranking..');</script> 
       <?php 
      } 

     } 
     elseif($oppscore > $userscore) 
     {  
      $Loser_ID = $_SESSION['user']; 
      $query = mysql_query("SELECT user_id FROM users WHERE username = '".$opponent."'"); 
      $result = mysql_fetch_array($query) or die(mysql_error()); 
      $Winner_ID = $result['user_id']; 

      //get rating from user table in database 

      $query1 = mysql_query("SELECT Elo FROM users WHERE user_id=".$_SESSION['user']); 
      $result1 = mysql_fetch_array($query1) or die(mysql_error()); 
      $loserRating = $result1['Elo']; 

      $query2 = mysql_query("SELECT Elo FROM users WHERE user_id=".$Loser_ID); 
      $result2 = mysql_fetch_array($query2) or die(mysql_error()); 
      $winnerRating = $result1['Elo']; 

      $rating = new Rating($winnerRating, $loserRating, 1, 0);    
      $results = $rating->getNewRatings(); 

      $results = $rating->getNewRatings(); 
      if(mysql_query("UPDATE users SET Elo = " . $results['b'] . " WHERE user_id=".$_SESSION['user'])) 
      { 

      } 
      else 
      { 
       ?> 
       <script>alert('There was an error while entering losers(user) ranking...');</script> 
       <?php 
      } 
      if(mysql_query("UPDATE users SET Elo = " . $results['a'] . " WHERE user_id=".$Winner_ID)) 
      { 

      } 
      else 
      { 
       ?> 
       <script>alert('There was an error while entering winners(opp) ranking...');</script> 
       <?php 
      } 

     } 
     if(mysql_query("INSERT INTO games(WinnerID,LoserID,PointsFor,PointsAgainst) VALUES('$Winner_ID','$Loser_ID','$userscore','$oppscore')")) 
     { 
      ?> 
      <script>alert('Your scores were successfully entered');</script> 
      <?php 
     } 
     else 
     { 
      ?> 
      <script>alert('There was an error while entering your score...');</script> 
      <?php 
     } 
    } 
    else 
    { 
     ?> 
     <script>alert('There cannot be a tie in ping pong, please re-enter your scores...');</script> 
     <?php 
    } 

} 
?> 
+0

あなたの実際の質問は、勝者のみを表示するクエリに敗者を表示させる方法です。 – Sean

+0

あなたの 'SELECT'が今返すものの例と、あなたが返そうとしているものの例を表示できますか? –

+0

@Sean正確に。 WinnerIDの情報を表示するだけで、私が間違っていると私は正しいと思います。私の問題は、ポイントとポイントが加算されないということです。彼らは等しいでしょう。勝利と損失と同じです。 –

答えて

1

クエリが失敗したのは、プレーヤーが失った行を考慮していないためです。 unionsを使って修正できます。次のクエリは、あなたが欲しいものを行う必要があります。

SELECT username AS "Username", 
    SUM(wins) AS "Wins", 
    SUM(PF) AS "Points For", 
    SUM(PA) AS "Points Against", 
    elo AS "Ranking" 
FROM (
    (SELECT users.user_ID, 
      users.username AS username, 
      COUNT(games.WinnerID) AS wins, 
      SUM(games.PointsFor) AS PF, 
      SUM(games.PointsAgainst) AS PA, 
      users.Elo AS elo 
    FROM users, games 
    WHERE games.WinnerID = users.user_ID 
    GROUP BY users.user_ID) 
    UNION ALL 
    (SELECT users.user_ID, 
     users.username AS username, 
     0 AS wins, 
     SUM(games.PointsAgainst) AS PF, 
     SUM(games.PointsFor) AS PA, 
     users.Elo AS elo 
    FROM users, games 
    WHERE games.LoserID = users.user_ID 
    GROUP BY users.user_ID) 
) AS t 
GROUP BY username 
ORDER BY user_ID; 

注意「を失ったクエリ」のフィールドPointsAgainstはカウンターとその逆プレイヤーの「ためのポイント」としてでなければならないこと。

+0

私はあなたのおかげでそこに損失の列を配置する方法を考え出した。とても有難い! –

0

あなた

INSERT INTO games(WinnerID,LoserID,PointsFor,PointsAgainst) VALUES('$Winner_ID','$Loser_ID','$userscore','$oppscore') 

クエリでは、潜在的に間違った順序で$userscore$oppscore値が含まれています。 $Winner_IDおよび$Loser_IDは、条件付き処理で変更されることがありますが、$userscoreおよび$oppscoreは、その時点で同様に反転されません。

また、条件構造は一般的に不必要に冗長です。勝者と敗者のIDとスコアを最初に決定してから、エラーが起こりやすいコピーペーストのほぼ同一のコードの複製に頼るのではなく、一度すべての処理を実行する必要があるようです。

1

内部結合としてそれを試してみてください、とusername列にMIN()を取り除く:また

SELECT u.username, COUNT(g.WinnerID), 
     SUM(g.PointsFor), SUM(g.PointsAgainst), u.Elo 
    FROM users u, games g 
    WHERE u.user_id = g.WinnerID 
    GROUP BY u.username, u.Elo; 

、誰がタスクに表示されます前に、あなたはmysqliの代わりに、mysql(またはそれ以上を使用する必要がありますまだPDO)、動的SQLの代わりにprepared statementを使用する必要があります。

+0

これは上記の私のSELECTステートメントと同じ出力を得ます。 –

+0

データが完了する前に確認しましょうウサギの穴から遠すぎる'SELECT SUM(PointsFor)、SUM(PointsAgainst)FROM games;を実行し、それが成功したら' SELECT WinnerId、SUM(PointsFor)、SUM(PointsAgainst)FROM games GROUP BY WinnerID;を試してみてください。 –

関連する問題