2015-12-15 4 views
6

Я создаю сайт в php для регистрации баллов ping pong для моей школы, и в настоящее время игрок, который выигрывает, запишет WinnerID, LoserID, PointsFor, PointsAgainst. У меня есть две таблицы со следующими отношениями.Нужна помощь в подсчете выигрышей и убытков от очков, набранных

Таблица: пользователи

  • user_id (PK)
  • имя пользователя
  • Elo

стол: игры

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

Моя команда вставки в файл РНР:

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 и могут измениться в вашей условной обработке, но $userscore и $oppscore не так перевернуты в это время.

Также ваша условная структура в общем случае излишне подробна. Похоже, вы должны просто определить сначала идентификатор победителя и проигравшего, а затем выполнить всю свою обработку один раз, вместо того чтобы прибегать к дублированию копии с копией почти идентичного кода.

1

Попробуйте это как внутреннее соединение, и избавиться от MIN() на username колонке:

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;' –