排名通知关系,但之后没有跳过适当的排名

时间:2012-02-28 21:52:07

标签: mysql rank

我本来希望不要在这里发帖,但我整天都在谷歌搜索,但没有用。我有一些代码来对我的表中的记录进行排名,我之后的格式是1,1,3,4,5,5,5,8。我已经设法注意到第一个记录中的记录了两个相等的记录然后忽略第三个。它也没有正确跳过。因此,例如,如果前3个记录是相同的,则将它们排列为1,1,2。这是我的代码,我只偶尔使用MySQL大约7个月,所以毫无疑问它并不完美:

    <?php

    $year = "$_POST[year]";
    $gender = "$_POST[gender]";
    $age = "$_POST[age]";
    $event = "$_POST[event]";

    // Formulate Query
    $query = sprintf("SELECT CONCAT(athletes.firstname,' ',athletes.lastname) AS athletename, athletes.athleteid, events.eventid, events.eventname, events.eventcode, meetings.meetingid, meetings.meetingname, meetings.location, meetings.meetingdate, meetings.year, DATE_FORMAT(meetings.meetingdate,'%%d %%b %%Y') AS date, results.performance, results.performance, results.eventid, agegroups.agegroupid, agegroups.agegroup 
    FROM results 
    JOIN athletes ON athletes.athleteid = results.athleteid
    JOIN meetings ON meetings.meetingid = results.meetingid
    JOIN events ON events.eventid = results.eventid
    JOIN agegroups ON agegroups.agegroupid = results.agegroupid
    WHERE results.performance = ANY (SELECT MIN(results.performance) FROM results WHERE meetings.year LIKE '%s' AND athletes.gender LIKE '%s' AND agegroups.agegroup LIKE '%s' AND results.eventid='%s'GROUP BY results.athleteid) ORDER BY results.performance asc
    ",
mysql_real_escape_string($year),
    mysql_real_escape_string($gender),
mysql_real_escape_string($age),
    mysql_real_escape_string($event));

    // Perform Query
    $result = mysql_query($query);

    // Check result
    if (!$result) {
    $message  = 'Invalid query: ' . mysql_error() . "\n";
    $message .= 'Whole query: ' . $query;
    die($message);
    }

    // HTML for ranking table
  echo "<table width='100%' border='0'>";
    echo "<tr><th width='25%' align='left'>Name</th>";
    echo "<th width='10%' align='left'>Perf</th>";
    echo "<th width='10%' align='left'>Age</th>";
    echo "<th width='45%' align='left'>Meeting</th>";
    echo "<th width='15%' align='right'>Date</th></tr>";
    // Use result
    $rank = $prevScore = 0; while ($row = mysql_fetch_assoc($result)) {     
    if ($row['performance'] > $prevScore) $rank++;     
    $prevScore = $row['performance'];   
    echo "<table valign='top' border='0' width='100%'>";
echo "<tr><td width='25%'> <a href='profile.php?id=$row[athleteid]'> $row[athletename] </a> </td>";
    echo "<td width='10%'> $rank </td>";
    echo "<td width='10%'> $row[performance] </td>";
    echo "<td width='10%'> $row[agegroup] </td>";
echo "<td width='45%'> <a href='meeting.php?id=$row[meetingid]'> $row[meetingname] </a></td>";
    echo "<td width='15%' align='right'> $row[date] </td></tr>";
    }
echo "</table>";

    // Free the resources associated with the result set
    mysql_free_result($result);
    ?>

1 个答案:

答案 0 :(得分:0)

在循环之前初始化两个变量以跟踪$naive_rank,然后$aware_rank然后替换

if ($row['performance'] > $prevScore) $rank++;

$naive_rank++; // always increment
if ($row['performance'] > $prevScore) {
    //whenever a non-tie occurs the aware rank catches up
    $aware_rank = $naive_rank;
    $rank = $naive_rank;
} else {
    //whenever a tie occurs, just use the old aware rank
    $rank = $aware_rank;
}