Нумерация внутри групп при выборке в MySQL

Ситуация: есть выборка, записи в которой делятся на определенные блоки (например, ученики в классе, номер элемента описи, товары в корзине) и нужно эти элементы пронумеровать. При этом нумерация начинается с единицы, продолжается в пределах группы, а затем опять начинается с единицы.

Решение:

SET @curRow := 1, @marker := '';
SELECT *,
    CASE t.field
      WHEN @marker
      THEN @curRow := @curRow + 1
      ELSE @curRow := 1 AND @marker := t.field
    END AS range
FROM sometable t
ORDER BY t.field;

Идея в использовании переменных пользователя. Мы определяем номер внутри группы (@curRow) и некоторый маркер (@marker). В самом запросе сравниваем значение поля, определяющего группу (идентификатор класса, описи, корзины), с текущим значением переменной. Если они равны, то это значит, что группа продолжается и номер @curRow становится больше на единицу, в противном случае номер сбрасывается на значение по умолчанию, а маркер @marker становится равным значению поля, определяющего группу. При этом в поле range попадает искомый номер в последовательности внутри группы.

Важно при этом не забыть добавить сортировку по полю, определяющему группу.