MySQL表排名将第一行排名为0而不是1

时间:2012-03-05 22:33:25

标签: mysql function count increment ranking

我在排查表格中的记录方面遇到了麻烦。它似乎是正确处理关系,但由于某种原因,第一行被排名为零,所以我得到的顺序就像0,2,2,4,5一样。我一直在玩这已经很久了,我没有运气,我一直都在谷歌。我有一种感觉,我错过了一些非常简单明显的东西,但如果我能发现它,我会被诅咒。

任何帮助将不胜感激

<?php
$year = "$_POST[year]";
$gender = "$_POST[gender]";
$age = "$_POST[age]";
$event = "$_POST[event]";

// Formulate Query
$query = sprintf("SELECT * FROM (SELECT CONCAT(athletes.firstname,' ',athletes.lastname) AS athletename, athletes.athleteid, 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.unit, results.eventid, results.position, results.heat, results.wind, 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 MAX(results.performance) from results WHERE meetings.year LIKE '%s' AND athletes.gender LIKE '%s' AND agegroups.agegroup LIKE '%s' AND results.eventid='%s' AND meetings.indoors='no' AND events.eventtype='field' GROUP BY results.athleteid)
ORDER BY results.performance desc, meetings.meetingdate asc) t1
GROUP BY t1.athleteid ORDER BY performance desc",
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);
}

// Use result
$rank = 0; $prevScore = 0; $naive_rank = 0; $aware_rank = 0; while ($row = mysql_fetch_assoc($result)) {     
$naive_rank++; // always increment
if ($prevScore > $row['performance']) {
//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;
} 
$prevScore = $row['performance'];   
echo "<table valign='top' border='0' width='100%'>";
echo "<tr><td width='5%'> $rank </td>";
echo "<td width='20%'> <a href='profile.php?id=$row[athleteid]'> $row[athletename] </a> </td>";
echo "<td width='5%' align='right'> $row[performance] </td>";
echo "<td width='5%' align='left'> $row[unit] </td>";
echo "<td width='5%'> $row[wind] </td>";
echo "<td width='5%'> $row[position] </td>";
echo "<td width='5%'> $row[heat] </td>";
echo "<td width='5%'> $row[agegroup] </td>";
echo "<td width='30%'> <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);
?>

修改

当前显示的表格:

| # | Name      | Perf. | Pos. | Age | Meeting   | Location | Date |
--------------------------------------------------------------------
| 0 | Athlete A | 18.89 | 1    | U17 | Meeting A | Location | Date |
| 2 | Athlete B | 17.99 | 3    | U20 | Meeting C | Location | Date |
| 2 | Athlete C | 17.99 | 2    | V50 | Meeting F | Location | Date |
| 4 | Athlete D | 15.66 | 1    | U23 | Meeting H | Location | Date |
| 5 | Athlete E | 12.43 | 4    | U15 | Meeting B | Location | Date |

1 个答案:

答案 0 :(得分:1)

我认为这是因为你将$prevScore初始化为0,所以对于第一个运动员来说,$prevScore > $row['performance']是假的,所以$rank = $aware_rank从0开始。此时$naive_rank 1}}是1。

然后对于2号运动员,$naive_rank为2,所以你得到了跳跃。

你可以:

  • $prevScore初始化为无穷大(即一些巨大的数字,以便第一位运动员$prevScore > $row['performance'],以便将$aware_rank$rank设置为1(而不是0) );
  • $aware_rank初始化为1,以便athelete 1获得$rank = $aware_rank(因为对于第一位运动员,如果表现总是&gt; = 0,则$prevScore > $row['performance']将永远不会为真,因为{{ 1}}是0)。