Ранжирование таблиц MySQL занимает первую строку как 0 вместо 1 - PullRequest
0 голосов
/ 06 марта 2012

У меня проблемы с ранжированием записей в моей таблице.Кажется, он правильно обрабатывает связи, но по какой-то причине первая строка ранжируется как ноль, поэтому порядок, который я получаю, выглядит как 0, 2, 2, 4, 5. Я играл сэто целую вечность, и мне не повезло, и я был по всему Google.У меня такое чувство, что я упускаю что-то действительно простое и очевидное, но я буду проклят, если смогу это заметить.

Любая помощь будет оценена

<?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 Ответ

1 голос
/ 06 марта 2012

Я думаю, это потому, что вы инициализируете $prevScore в 0, поэтому для самого первого спортсмена $prevScore > $row['performance'] ложно, и поэтому $rank = $aware_rank, который начинается с 0. В этот момент $naive_rank равно 1.

Тогда для спортсмена номер 2, $naive_rank равно 2, поэтому вы получите прыжок.

Вы можете либо:

  • инициализировать $prevScore в бесконечность (т. Е. Какое-то огромное число, чтобы для первого спортсмена $prevScore > $row['performance'], чтобы $aware_rank и $rank были установлены в 1 (вместо 0)); OR
  • инициализируйте $aware_rank в 1, чтобы атлет 1 получил $rank = $aware_rank (поскольку для первого спортсмена $prevScore > $row['performance'] никогда не будет истинным, если производительность всегда> = 0, поскольку $prevScore равно 0).
...