Вот подход, который использует подход, задокументированный https://www.xaprb.com/blog/2006/12/15/advanced-mysql-user-variable-techniques/.. Он использует переменную и избегает проблем с отложенной оценкой, поскольку «MySQL не оценивает выражения, содержащие пользовательские переменные, до тех пор, пока они не будут отправлены клиенту».В нем используется подход использования функций для немедленной оценки переменных.
Вот что я использовал на sqlfiddle.com, чтобы попробовать:
Таблица, создание и вставка значений.
CREATE TABLE Table1
(`Id` int, `value` varchar(3))
;
INSERT INTO Table1
(`Id`, `value`)
VALUES
(1, 'foo'),
(1, 'bar'),
(2, 'foo'),
(3, 'bar'),
(3, 'foo')
;
И SQL-запрос для MySQL
set @increment := 0, @id := '';
select @increment, id, value
from Table1
where 0 <= greatest(
@increment := if(@id = id, @increment + 1, 1),
least(0, @id := id));
Вот результат:
@increment id value
1 1 foo
2 1 bar
1 2 foo
1 3 bar
2 3 foo