Есть таблица меню в БД с полем порядка order_id, но порядок неправильный и надо порядок обновить по алфавиту другого поля title. Сортировка по полю title исключается, потому что таблица представляет из себя иерархическое меню, где порядок может менять пользователь устанавливая order_id. Использовать отдельно серверную обработку (php) тоже невыгодно — лишнее разделение бизнес логики если это можно сделать в БД, да и на случай больших объемов данных это займёт больше ресурсов.

Решение

В MySQL к сожалению отсутсвует такая возможность ROWNUMRANK()ROW_NUMBER() как в ORACLE или MSSQL. Присутсвие _rowid никак не влияет на ситуацию. В нашем случае можно использовать переменные, введённые с пятой версии (или раньше):

SET @rank=0;
SELECT @rank:=@rank+1 AS rank, id FROM menu;

Для обновления такой таблицы через саму себя у меня не получилось, поэтому я просто скопировал таблицу под другим именем и выполнил такой запрос:

SET @rank=0;
UPDATE `menu` SET order_id=(
SELECT @rank:=@rank+1 FROM `menu2` WHERE `menu`.id=`menu2`.id LIMIT 1
) WHERE parentID=0 ORDER BY `title` ASC;

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *