Нумерация внутри групп при выборке в 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 попадает искомый номер в последовательности внутри группы.

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

Проблемы нормализации баз данных

1. В Ленинградской области более 300 сельскохозяйственных предприятий. Названия 11 из них включают в себя словосочетание «Сельскохозяйственное предприятие» или аббревиатуру:

Андреевское, Бекон, Восход, Климово, Кузнечное, Матросово, Пашозерское, Петродвор, Салма, Смена, Сяглицы

Ещё одно предприятие — «Лосево» — выделилось, назвавшись не СП «Лосево», а СХП «Лосево».

2. Ещё в Ленинградской области есть Сельскохозяйственный производственный кооператив «Коопхоз «Нива»». Коопхоз — это вид сельскохозяйственного производственного кооператива. Просто удивительно, как они обошлись без ООО или ЗАО в названии.

Вот он, тот самый ад перфекциониста.