1

我有一个包含游戏分数的多列表。格式是每个分数都附有一个 gameid 编号。然后我找到每个游戏 ID 的最高分并显示它。问题是如果一个游戏被删除,并且gameid号不再连续,它会显示该游戏相同高分的2个。例如,gameid 3 的得分为 5000,gameid 4 的得分为 6000,gameid 5 的得分为 3200。如果我删除 gameid 4,输出将是 5000-3、5000-3、3200-5。我显然没有希望它输出2个相同的分数。下面是我用来执行此操作的 PHP 代码:

<?php

echo '<table cellpadding="0" class="content" cellspacing="0" width="100%" >';
echo '<tr><th>Game</th><th>Initials</th><th>Score</th><th>Date</th></tr>';

include("includes/sqlconnect.inc");
include("includes/functions.php");
$idnum=1;

    $allscores = mysql_query("SELECT * FROM scores");
    $highid = array(
    );
    while($row = mysql_fetch_array( $allscores ))
    {
    $idnums=$row['gameid'];
    $highid[]=$idnums;      
    }
while($idnum<=max($highid))
{
    $allscores = mysql_query("SELECT * FROM scores WHERE gameid ='$idnum'");
    $array = array(
    );
    while($row = mysql_fetch_array( $allscores ))
    {
    $score=$row['score'];
    $scoreid=$row['scoreid'];
    $array[$scoreid]=$score;      
    }
    $high=doublemax($array);
    $nameid = mysql_query("SELECT scoreid,playerid,score FROM scores WHERE scoreid='$high[i]'");
    while($row = mysql_fetch_array($nameid))
    {
    $player=$row['playerid'];
    }
    $dateid = mysql_query("SELECT scoreid,date FROM scores WHERE scoreid='$high[i]'");
    while($row = mysql_fetch_array($dateid))
    {
    if($row['date']=="")
    {
            $date="Unknown";
    }
    else
    {
            $date=$row['date'];
    }
    }
    $name = mysql_query("SELECT playerid,player_initials FROM players WHERE playerid='$player'");
    while($row = mysql_fetch_array($name))
    {
    $initials=$row['player_initials'];
    }
    $gamename = mysql_query("SELECT gameid,gamename FROM games WHERE gameid='$idnum'");
    while($row = mysql_fetch_array($gamename))
    {
    $game=$row['gamename'];
    }

    $idnum++;

            echo "<tr>";
            echo '<td>'.$game.'</td>';
            echo '<td>'.$initials.'</td>';
            echo '<td>'.number_format($score).'</td>';
            echo '<td>'.$date.'</td>';      
    echo "</tr>";

    }

echo "</table>";

?>
4

2 回答 2

1

你这样做太难了。您的查询应如下所示:

SELECT
    game_id,
    MAX(score)
FROM
    scores

然后,如果您想显示有关该游戏的更多信息并且不想重复,请这样做:

SELECT
    h.game_id,
    h.score,
    (
        SELECT 
            /*for example*/ date_played 
        FROM 
            scores 
        WHERE 
            game_id = h.game_id AND 
            score = h.score 
        LIMIT 1
    ) date_played
FROM
(
    SELECT
        game_id,
        MAX(score) score
    FROM
        scores
) hiscores h

简而言之:mysql 是以您想要的形式获取数据的工具。不要在完全没有必要的地方过度使用 php。

于 2012-11-13T07:26:01.503 回答
0

问题是您将输出数量基于 id 而不是返回的数据行数。

而不是稍后在您的初始查询中获得最高分数

 $allscores = mysql_query("SELECT field1, field2, MAX(score) FROM scores GROUP BY gameid"); // I don't know the field names you need obviously place those instead of field1 etc.

然后将您的主循环基于 foreach 而不是 while。

于 2012-11-13T07:29:55.227 回答