Таким образом, у меня есть процедура, которая делает (псевдо-код):MySQL приращения переменного в хранимой процедуре
$rows = SELECT DISTINCT a, b FROM t1;
foreach($rows as $row) {
SET @i = 0;
UPDATE t1 SET c_index = @i := (@i+1)
WHERE a = $row[a] and b = $row[b] ORDER BY c DESC;
}
Дела в том, чтобы номер подмножества строк тем, как они сортируются. Работает нормально, но это обновление выполняется тысячи раз, поэтому довольно медленно. Чтобы ускорить это, я хочу поместить его в хранимую процедуру.
BEGIN
DECLARE done INT DEFAULT 0;
DECLARE vA, vB, i INT;
DECLARE cur1 CURSOR FOR
SELECT DISTINCT a, b
FROM t1 WHERE ...;
DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = 1;
OPEN cur1;
WHILE done = 0 DO
FETCH cur1 INTO vA, vB;
IF done = 0 THEN
SET i=0;
UPDATE t1
SET c_index = i:= (i+1)
WHERE a = vA AND b = vB
ORDER BY c DESC;
END IF;
END WHILE;
CLOSE cur1;
END
Однако при создании описанной выше процедуры MySQL говорит о синтаксической ошибке в «i: = ...». Если я использую переменную сеанса для «i», она работает (@i). Использование переменной сеанса в хранимой процедуре не очень элегантно. Как можно сохранить указанную выше хранимую процедуру без использования переменной сеанса для «i»?
Нет, приращение в первую очередь не помогает, так как для каждой строки требуется увеличение, а ваше окончательное решение использует переменные сеанса, которых я хочу избежать. – ColinM
@ColinM у вас есть какой-то «идентификатор» в вашей таблице (например, колонка автоинкремента)? – peterm
@ColinM или это комбинация '(a, b, c)' UNIQUE? – peterm