1

ゲームのスコアを保持する複数列のテーブルがあります。形式は、各スコアにゲームID番号が付加されているというものです。次に、各gameidの最高スコアを見つけて、それを表示します。問題は、ゲームが削除され、gameid番号が連続しなくなった場合、ゲームの同じハイスコアが2つ表示されることです。たとえば、gameid 3のスコアは5000、gameid 4のスコアは6000、gameid 5のスコアは3200です。gameid4を削除すると、出力は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に基づいて作成します。

于 2012-11-13T07:29:55.227 に答える