Я смешиваю переменные сессии / @, и агрегация может быть немного ненадежной, но вы можете просто попробовать изменить порядок выражений выбора на student_id, @cur:=SUM(total_marks), @curRank := IF(@prev= @cur, @curRank, @curRank + 1 ) AS classPosition, @prev:=@cur
Если это не поможет, я 'Я предлагаю разделить вашу агрегацию и рейтинг.На самом деле, вы уже суммируете в подзапросе, поэтому я не совсем уверен, почему вы не просто включили сумму в результаты от n
.
SELECT * FROM (
SELECT @curRank := IF(@prev= @cur, @curRank, @curRank + 1 ) AS classPosition, student_id, @prev:=@cur, @cur:=overall
FROM (SELECT m.*, SUM(total_marks) AS overall
FROM marks m
WHERE classform_name = ? AND term = ? AND academic_year = ?
GROUP BY student_id
ORDER BY overall DESC
) AS n
CROSS JOIN (SELECT @curRank := 0, @prev:=NULL, @cur:=NULL ) AS q
) AS completeRankings
WHERE student_id = ?
На самом деле ваш исходный запрос должен 'у нас все равно были другие проблемы.n
включил бы только одно случайное total_marks
значение для каждого student_id;делая внешний SUM-вид бессмысленным.
Редактировать - Это должно позволить прогрессированию позиции «пропускать» более поздние позиции в соответствии с связями:
SELECT @curRank := @curRank + 1 AS counter, @prevRank := IF(@prev=@cur, @prevRank, @curRank) AS classPosition
... toпропустите counter
из окончательных результатов, вам придется явно развернуть *
.