2015-12-15 7 views
6

Ich erstelle eine Website in PHP, um Ping Pong Noten für meine Schule zu protokollieren, und derzeit wird der Spieler, der gewinnt die WinnerID, LoserID, PointsFor, PointsAgainst loggen. Ich habe zwei Tabellen mit den folgenden Beziehungen.Brauchen Sie Hilfe bei der Berechnung von Gewinnen und Verlusten von Punkten

Tabelle: Benutzer

  • benutzer_ID (PK)
  • Benutzername
  • Elo

Tabelle: Spiele

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

Meine Insert-Anweisung in der PHP-Datei ist:

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

Hier ist, was ich versucht habe, aber es wird nicht angezeigt die Punktzahl richtig.

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

Wie Sie oben durch das Bild sehen können, werden die Punkte für und Punkte gegen Summen addieren sich nicht. Momentan werden nur die Statistiken für den Gewinner angezeigt. Das heißt, wenn PlayerA 21-5 gewinnt, wird es aus der Select-Anweisung angezeigt, aber PlayerB zeigt keine Punktzahl von 5-21. Jede Hilfe wird geschätzt.

PHP-Code für Seite Noten eingeben:

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

Also Ihre eigentliche Frage ist, wie Sie den Verlierer in Ihrer Abfrage angezeigt bekommen, die derzeit nur den Gewinner zeigt? – Sean

+0

Können Sie uns ein Beispiel zeigen, was Ihr 'SELECT' jetzt zurückgibt, und was es zurückgeben soll? –

+0

@Sean Genau. Es zeigt nur Informationen für die WinnerID, glaube ich, korrigiere mich, wenn ich falsch liege. Mein Problem ist, dass die Punkte für und gegen nicht zusammenkommen. Sie wären gleich. Gleiches gilt für Gewinne und Verluste. –

Antwort

1

Ihre Abfrage schlägt fehl, da die Zeilen, in denen der Spieler verliert, nicht berücksichtigt werden. Sie können das beheben, indem Sie unions verwenden. Die folgende Abfrage sollte das tun, was Sie wollen:

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; 

Beachten Sie, dass das Feld in der „verliert Abfrage“ PointsAgainst sollte „für Punkte“ und umgekehrt, wie die Spieler-Zähler sein.

+0

Vielen Dank! Ich habe sogar herausgefunden, wie man die Loss Column dank dir einstellt. Sehr geschätzt! –

0

Ihre

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

Abfrage enthält die $userscore und $oppscore Werte in einer möglicherweise falschen Reihenfolge. Die $Winner_ID und $Loser_ID können sich in Ihrer bedingten Verarbeitung ändern, aber $userscore und werden zu diesem Zeitpunkt nicht ähnlich umgedreht.

Auch Ihre bedingte Struktur ist im Allgemeinen unnötig ausführlich. Es scheint, als ob Sie in der Lage sein sollten, zuerst die Gewinner- und Verlierer-ID und die Punktzahlen zu ermitteln und dann alle Ihre Verarbeitungen einmal auszuführen, anstatt auf fehleranfällige Kopier- und Duplizierung von fast identischem Code zurückzugreifen.

1

Probieren Sie es als eine innere Verknüpfung, und der MIN() auf der username Spalte loszuwerden:

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; 

Auch bevor jemand, den Sie sonst Aufgabe übernimmt, sollten Sie mysqli statt mysql (oder besser verwenden noch, PDO) und Sie sollten vorbereitete Anweisungen anstelle von dynamischem SQL verwenden.

+0

Dieselbe Ausgabe wie meine SELECT-Anweisung über –

+0

. Stellen Sie sicher, dass Ihre Daten vollständig sind, bevor wir fortfahren zu weit im Kaninchenloch. Führen Sie 'SELECT SUM (PointsFor), SUM (PointsAgainst) FROM Spiele;' und wenn das funktioniert, versuchen Sie 'SELECT WinnerId, SUM (Points For), SUM (PointsAgainst) FROM Spiele GROUP BY WinnerID;' –

Verwandte Themen