Выберите максимальное значение и увеличьте его на единицу SQL - PullRequest
0 голосов
/ 13 июля 2020

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

UPDATE ps_category SET POSITION = ((SELECT POSITION, FROM ps_category ORDER BY POSITION DESC LIMIT 1 ) + 1) WHERE POSITION = 0

Например, если у меня есть 3 записи со значением 0, а максимальное значение в таблице равно 10, я хочу обновить эти записи со следующими значениями: 11,12 и 13.

Первая часть, которую я хотел для достижения было выбрать все записи с помощью POSITION= 0

SELECT * FROM ps_category WHERE POSITION = 0

С другой стороны, я хотел выбрать максимальное значение

SELECT POSITION, FROM ps_category ORDER BY POSITION DESC LIMIT 1 

После создания этих двух запросов я сделал их подзапрос, который обновляет желаемые записи, но с этим у меня проблемы, я не могу увеличить максимальное значение за один.

Есть идеи, как это сделать, или полезная документация? Всем спасибо.

Информация, связанная с таблицами

 CREATE TABLE `ps_category` (
    `id_category` INT(10) UNSIGNED NOT NULL AUTO_INCREMENT,
    `id_parent` INT(10) UNSIGNED NOT NULL,
    `id_shop_default` INT(10) UNSIGNED NOT NULL DEFAULT '1',
    `level_depth` TINYINT(3) UNSIGNED NOT NULL DEFAULT '0',
    `nleft` INT(10) UNSIGNED NOT NULL DEFAULT '0',
    `nright` INT(10) UNSIGNED NOT NULL DEFAULT '0',
    `active` TINYINT(1) UNSIGNED NOT NULL DEFAULT '0',
    `date_add` DATETIME NOT NULL,
    `date_upd` DATETIME NOT NULL,
    `position` INT(10) UNSIGNED NOT NULL DEFAULT '0',
    `is_root_category` TINYINT(1) NOT NULL DEFAULT '0',
    PRIMARY KEY (`id_category`) USING BTREE,
    INDEX `category_parent` (`id_parent`) USING BTREE,
    INDEX `nleftrightactive` (`nleft`, `nright`, `active`) USING BTREE,
    INDEX `level_depth` (`level_depth`) USING BTREE,
    INDEX `nright` (`nright`) USING BTREE,
    INDEX `activenleft` (`active`, `nleft`) USING BTREE,
    INDEX `activenright` (`active`, `nright`) USING BTREE)

Структура таблицы с примерами данных

Полезная информация

  • Версия: 5.7.31-log
  • Engine: InnoDB;
  • MySQLController: DbPDO

1 Ответ

0 голосов
/ 13 июля 2020

Возможно, cte с максимальным номером присоединяется ко всем записям, где position = 0.

;
WITH MaxPosition AS
(
    SELECT MaxValue=MAX(NewValue) FROM @T
)
,RunningValuesPlusMax
(   
    SELECT 
        PS.id_category,
        NewValue = ROW_NUMBER() OVER (ORDER BY PS.id_category) + MP.MaxValue
    FROM 
        ps_category PS
        INNER JOIN MaxPosition MP ON 1=1
    WHERE
        PS.POSITION = 0 
)
UPDATE PS
SET 
    PS.POSITION = RV.NewValue
FROM
    ps_category PS
    INNER JOIN RunningValuesPlusMax RV ON RV.id_category = PS.id_category
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...