2015-12-15 12 views
6

अंक से जीत और नुकसान की गणना करने में मदद की ज़रूरत है। मैं अपने स्कूल के लिए पिंग पोंग स्कोर लॉग करने के लिए PHP में एक वेबसाइट बना रहा हूं, और वर्तमान में जो खिलाड़ी जीतता है वह WinnerID, LoserID, PointsFor, PointsAgainst लॉग करेगा। मेरे पास निम्नलिखित संबंधों के साथ दो टेबल हैं।अंक

तालिका: उन

  • user_id (पी)
  • उपयोगकर्ता नाम
  • एलो

तालिका: खेल

  • game_id (पी)
  • WinnerID (FK)
  • LoserID (FK)
  • PointsFor
  • PointsAgainst

php फ़ाइल में मेरे डालने कथन है:

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

ऊपर छवि से देख सकते हैं, के लिए अंक और कुल योग पर अंक को जोड़ नहीं है। वर्तमान में, यह केवल विजेता के लिए आंकड़े दिखाता है। इसका अर्थ यह है कि यदि प्लेयर ए 21-5 जीतता है, तो यह चयन कथन से दिखाई देगा, लेकिन प्लेयरबी 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

क्या आप हमें एक उदाहरण दिखा सकते हैं कि अब आपका 'चयन' रिटर्न क्या है, साथ ही साथ आप इसे वापस लौटना चाहते हैं? –

+0

@ सीन बिल्कुल। यह केवल विजेता आईडी के लिए जानकारी प्रदर्शित करता है, मेरा मानना ​​है कि अगर मैं गलत हूं तो मुझे सही करें। मेरी समस्या यह है कि अंक के लिए और इसके खिलाफ अंक नहीं जोड़ते हैं। वे बराबर होंगे। जीत और नुकसान के साथ ही। –

उत्तर

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 इसी समय समान रूप से फ़्लिप नहीं किए गए हैं।

इसके अलावा आपकी सशर्त संरचना सामान्य रूप से अनावश्यक वर्बोज़ में है। ऐसा लगता है कि आप केवल विजेता और हारने वाले आईडी को निर्धारित करने और पहले स्कोर करने में सक्षम होना चाहिए, और फिर निकट-समान कोड के त्रुटि-प्रवण प्रति-पेस्ट डुप्लिकेशंस का उपयोग करने के बजाय एक बार अपनी सभी प्रोसेसिंग करें।

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; 

ही, इससे पहले किसी और कार्य पर ले जाता है, तो आप mysql के बजाय mysqli (या बेहतर उपयोग करना चाहिए अभी तक, PDO) और आपको गतिशील एसक्यूएल के बजाय तैयार कथन का उपयोग करना चाहिए।

+0

यह अभी भी –

+0

से ऊपर मेरे 'SELECT' कथन के समान आउटपुट प्राप्त करता है चलो सुनिश्चित करें कि आपका डेटा पूरा होने से पहले पूरा हो गया है खरगोश छेद से बहुत दूर। खेल से 'चयन एसयूएम (अंक के लिए), एसयूएम (अंक) से चलाएं;' और यदि यह काम करता है, तो 'विजेता विजेता आईडी, एसयूएम (पॉइंट्सफ़ोर), एसयूएम (पॉइंट्सएंड) चुनें, विजेता द्वारा ग्रुप द्वारा ग्रुप; ' –