MySQL rownum

    Постановка задачи


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

    Решение


    В MySQL к сожалению отсутсвует такая возможность ROWNUM, RANK(),
    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;



    Оригинал

    Комментарии 1

      0
      думаю стоит высказать автору топика благодарность за идею

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

      Самое читаемое