SELECT count(id) + 1
FROM orders
WHERE id < :currentId AND project_id = 2 AND created_at >= '2022-01-01'
Никакие гонки это не запутают. -- рабочая таблица
CREATE TABLE orders (
id INT AUTO_INCREMENT PRIMARY KEY,
project_id INT,
project_number INT
);
-- опорная таблица для генерации номеров в разрезе проектов
CREATE TABLE generate_project_number (
project_id INT,
project_number INT AUTO_INCREMENT,
PRIMARY KEY (project_id, project_number)
) ENGINE = MyISAM;
-- триггер-генератор
CREATE TRIGGER generate_project_number
BEFORE INSERT ON orders
FOR EACH ROW
BEGIN
-- вставить хапись в опорную таблицу для генерации номера
INSERT INTO generate_project_number (project_id) VALUES (NEW.project_id);
-- вставить сгенерированный номер в рабочую таблицу
SET NEW.project_number = LAST_INSERT_ID();
-- почистить опорную таблицу от лишних записей
DELETE FROM generate_project_number
WHERE project_id = NEW.project_id
AND project_number < NEW.project_number;
END