2012-02-28 1 views
0

나는 여기에 올 필요가 없길 희망했지만 하루 종일 인터넷 검색을 해왔습니다. 내 테이블에있는 레코드의 순위를 매기는 코드가 있고 형식은 1, 1, 3, 4, 5, 5, 5, 8입니다. 코드에서 첫 번째 두 레코드는 동일하지만 세 번째 레코드는 무시합니다. 또한 올바르게 건너 뛰지 않습니다. 예를 들어 처음 3 개의 레코드가 동일하다면 1, 1, 2로 등급이 매겨집니다.이 코드는 제가 가지고있는 코드입니다. 약 7 개월 동안 산발적으로 MySQL을 사용 했으므로 완벽하지는 않습니다.랭킹 고지가 묶이지 만 나중에 해당 순위를 건너 뛰지 않습니다.

<?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); 
    ?> 

답변

0

초기화 루프는 $naive_rank 추적하고 $aware_rank 다음 나는 $의 naive_rank 및 $ naive_ra로 $의 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; 
} 
+0

로 교체하기 전에 두 변수 nk = 0; $ aware_rank = 0; 이 올바른지? 이렇게하면 1, 1, 3, 4의 순서가되어 건너 뛰는 방식이 바뀌 었습니다. 유일한 문제는 상위 3 개 레코드가 모두 동일한 값이므로 실제로 1, 1, 1, 4를 읽어야합니다. – MarkyMark

+0

처음 3 개가 동일하지 않다는 것을 왜 인식하지 못할지 모르겠습니다. 귀하의 실적 번호가 int가 아닌가요? – Umbrella

+0

아니요 varchar로 설정 한 이유는 이벤트 유형에 따라 거리 및 점 합계뿐만 아니라 소수점 이하 2 자리까지의 지속 시간이 10 초에서 2 시간까지 다양하기 때문입니다. 그것은 내가 개발하고있는 육상 경기 데이터베이스이므로 모든 유형의 성능을 하나의 열에 포함시키는 가장 적합한 방법처럼 보였습니다 – MarkyMark

관련 문제