В MySQL 8+ вы должны сделать:
SELECT stdid, SUM(marks) as totalmarks
FROM (SELECT fr.*,
ROW_NUMBER() OVER (PARTITION BY stdid ORDER BY marks DESC) as seqnm
FROM finalresult fr
WHERE subjectcategory = 1 AND
classId = 3 AND
year = 2018 AND
term = 2 AND
type = 23
) fr
WHERE seqnum <= 2
GROUP BY stdid;
Обратите внимание, что я удалил одинарные кавычки.Вещи, которые выглядят как числа, вероятно, есть.И вы не должны смешивать тип - поместите кавычки обратно, если значения действительно хранятся в виде строк.
В более ранних версиях, вероятно, самый простой способ - использовать переменные, но вы должны быть очень осторожны с ними.MySQL не гарантирует порядок вычисления переменных в SELECT
, поэтому вы не можете назначить переменную в одном выражении и использовать ее в другом.
Сложное выражение решает это.Кроме того, лучше всего выполнить сортировку в подзапросе (последние версии MySQL 5+ требуют этого):
SELECT stdid, SUM(marks) as totalmarks
FROM (SELECT fr.*,
(@rn := IF(@s = stdid, @rn + 1,
IF(@s := stdid, 1, 1)
)
) as seqnum
FROM (SELECT fr.*
FROM finalresult fr
WHERE subjectcategory = 1 AND
classId = 3 AND
year = 2018 AND
term = 2 AND
type = 23
ORDER BY stdid, marks DESC
) fr CROSS JOIN
(SELECT @s = '', @rn := 0) params
WHERE seqnum <= 2
GROUP BY stdid;