Php 需要帮助根据得分计算胜负吗

Php 需要帮助根据得分计算胜负吗,php,mysql,Php,Mysql,我正在用php创建一个网站来记录我学校的乒乓球成绩,目前获胜的玩家将记录WinnerID、LoserID、PointsFor、PointsAgainst。我有两个具有以下关系的表 表:用户 用户ID(主键) 用户名 埃洛 表:游戏 游戏id(PK) 温尼里德(FK) 洛塞丽德(FK) 点 PointsAgainst 我在php文件中的insert语句是: INSERT INTO games(WinnerID,LoserID,PointsFor,PointsAgainst) VALUES(

我正在用php创建一个网站来记录我学校的乒乓球成绩,目前获胜的玩家将记录
WinnerID、LoserID、PointsFor、PointsAgainst
。我有两个具有以下关系的表

表:用户

  • 用户ID(主键)
  • 用户名
  • 埃洛
表:游戏

  • 游戏id(PK)
  • 温尼里德(FK)
  • 洛塞丽德(FK)
  • 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

如上图所示,总分数与总分数之和不符。目前,它只显示获胜者的统计数据。这意味着如果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
    }

}
?>
if(isset($\u POST['btn-POST']))
{
$oppost=$_POST[“oppost”];
//$oppost=array_key_exists('oppost',$_POST)?$_POST['oppost']:false;
$userscore=mysql\u real\u escape\u字符串($\u POST['userscore']);
$oppscore=mysql\u real\u escape\u字符串($\u POST['oppscore']);
如果($userscore!=$oppscore)
{
如果($userscore>$oppscore)
{
$Winner\u ID=$\u会话['user'];
$query=mysql\u query(“从username='“$opporter.”的用户中选择用户\u id”;
$result=mysql\u fetch\u数组($query)或die(mysql\u error());
$Loser_ID=$result['user_ID'];
$query1=mysql_query(“从用户中选择Elo,其中user_id=”.$_SESSION['user']);
$result1=mysql\u fetch\u数组($query1)或die(mysql\u error());
$winnerRating=$result1['Elo'];
$query2=mysql\u query(“从用户中选择Elo,其中user\u id=“.$Loser\u id”);
$result2=mysql\u fetch\u数组($query2)或die(mysql\u error());
$loserRating=$result1['Elo'];
$rating=新评级($winnerRating,$loserRating,1,0);
$results=$rating->getNewRatings();
如果(mysql_查询(“更新用户集Elo=“.$results['a']”.,其中用户_id=“.$\u会话['user']))
{
}
其他的
{
?>
警报('输入获奖者(用户)排名时出错…');
警报(“输入失败者(opp)排名时出错…”;
你的

查询包含的
$userscore
$oppscore
值可能顺序错误。在条件处理过程中,
$Winner\u ID
$Loser\u ID
可能会发生更改,但
$userscore
$oppscore
此时不会进行类似的翻转


另外,您的条件结构通常不必要地冗长。似乎您应该能够首先确定赢家和输家ID并得分,然后将所有处理过程执行一次,而不是诉诸于对几乎相同的代码进行容易出错的复制粘贴复制。

尝试将其作为内部联接,并去掉
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。

您的查询失败,因为它没有考虑播放机丢失的行。您可以通过使用来修复此问题。以下查询应满足您的要求:

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
应作为玩家的“积分”计数器反之亦然。

那么,你真正的问题是如何让输家出现在你的查询中,而你的查询目前只显示赢家?你能给我们举个例子,说明你的
SELECT
现在返回什么,以及你希望它返回什么吗?@Sean完全正确。它只显示赢家ID的信息,我相信,如果我错了,请纠正我。我的假设赞成和反对的分数加起来是不一样的。它们是相等的。赢和输也是一样。@DarwinvonCorax我添加了
SELECT
返回的内容。谢谢你的帮助。所以列的分数之和应该等于列的分数之和?这仍然得到与上面我的
SELECT
语句相同的输出在我们深入兔子洞之前,确保您的数据完整。从游戏中运行
选择SUM(PointsFor),SUM(PointsAgainst);
如果有效,请尝试
选择WinnerId,SUM(PointsFor),SUM(PointsAgainst)来自WinnerID游戏组;
非常感谢!多亏了你,我甚至想出了如何将损失列放在那里。非常感谢!
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;