2015-12-15 56 views
6

我在php中创建了一个网站来记录我的学校的乒乓分数,目前赢得的玩家将记录WinnerID, LoserID, PointsFor, PointsAgainst。我有两个表格,具有以下关系。需要帮助计算点得分的胜利和损失

表:用户

  • USER_ID(PK)
  • 用户名
  • 的Elo

表:游戏

  • 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。

+0

这仍然会得到与我上面的'SELECT'语句相同的输出 –

+0

让我们确保您的数据在我们离开之前完成兔子洞下面太远了。运行'SELECT SUM(PointsFor),SUM(PointsAgainst)FROM games;'如果这样做,请尝试'SELECT WinnerId,SUM(PointsFor),SUM(PointsAgainst)FROM游戏GROUP BY WinnerID;' –