Я пытаюсь сделать систему управления результатами студентов. Я сталкиваюсь с проблемой, когда пытаюсь поставить каждого ученика в зависимость от его общей оценки на экзамене. В моем выводе я получаю 1-й (получить отметку 450), 2-й (получить отметку 449), 4-й (получить отметку 448). 3-я позиция отсутствует. 5-я, 10-я, а также некоторые другие позиции отсутствуют. Но я не нахожу никаких проблем в своем коде.
Моя база данных
if (!function_exists('get_position_in_exam')) {
function get_position_in_exam($school_id, $exam_id, $class_id, $section_id, $mark) {
$ci = & get_instance();
$sql = "SELECT id, total_obtain_mark, FIND_IN_SET( total_obtain_mark,(
SELECT GROUP_CONCAT( total_obtain_mark ORDER BY total_obtain_mark DESC )
FROM exam_results WHERE school_id = $school_id AND exam_id = $exam_id AND class_id = $class_id AND section_id = $section_id ))
AS rank
FROM exam_results
WHERE school_id = $school_id AND exam_id = $exam_id AND class_id = $class_id AND section_id = $section_id AND total_obtain_mark = $mark";
$rank = @$ci->db->query($sql)->row()->rank;
if ($mark == 0){
return '--';
}
if ($rank == 1){
return $rank.'st';
}elseif ($rank == 2){
return $rank.'nd';
}elseif ($rank == 3){
return $rank.'rd';
}elseif ($rank > 3 ){
return $rank.'th';
}else{
return '--';
}
}
}
да как это решить?






Вам нужен отдельный total_obtain_mark в вашем подзапросе
GROUP_CONCAT( distinct total_obtain_mark ORDER BY total_obtain_mark DESC )
"SELECT id, total_obtain_mark, FIND_IN_SET( total_obtain_mark,(
SELECT GROUP_CONCAT( distinct total_obtain_mark ORDER BY total_obtain_mark DESC )
FROM exam_results WHERE school_id = $school_id AND exam_id = $exam_id AND class_id = $class_id AND section_id = $section_id ))
AS rank
FROM exam_results
WHERE school_id = $school_id AND exam_id = $exam_id AND class_id = $class_id AND section_id = $section_id AND total_obtain_mark = $mark";
в противном случае, если у вас есть ученик с таким же рангом, вы пропускаете позицию
у вас есть дубликаты результатов экзаменов по делам о недостающих рангах?