Любой способ удалить дубликат оператора SELECT?

Для краткости предположим, что у нас есть numbers таблица с 2 столбцами: id & number:

CREATE TABLE numbers(
   id INT NOT NULL AUTO_INCREMENT,
   NUMBER INT NOT NULL,
   PRIMARY KEY ( id )
);

Я хочу number столбец с автоинкрементом, но перезапуск с 1 после нажатия 100, удовлетворяющий следующим требованиям:

  1. Если еще нет записей, установите number до 1.
  2. Если в таблице уже есть записи:
    1. Если последняя запись number меньше 100, установлено number к этому + 1.
    2. Если последняя запись number 100 или больше, установите number до 1.

Вот что у меня так далеко:

INSERT INTO `numbers` (`number`)
VALUES (
    IF(
        IFNULL(
            (SELECT `number`
            FROM `numbers` as n
            ORDER BY `id` DESC
            LIMIT 1),
            0
        ) > 99,
        1,
        IFNULL(
            (SELECT `number`
            FROM `numbers` as n
            ORDER BY `id` DESC
            LIMIT 1),
            0
        ) + 1
    )
)

Это работает, но использует два одинаковых SELECT запросы.

Есть ли способ удалить дубликат SELECT?


PS Я хочу сделать все это в запросе. Нет триггеров или хранимых процедур.

3 ответа

Решение

Попробуйте использовать по модулю % оператор

INSERT INTO `numbers` (`number`)
VALUES (
          IFNULL(
            (SELECT `number`
            FROM `numbers` as n
            ORDER BY `id` DESC
            LIMIT 1),
            0
        ) % 100 + 1
    )

Вы можете использовать временную переменную.

INSERT INTO `numbers`(`number`) VALUES (
  IF((@a := IFNULL((SELECT number FROM `numbers` AS n ORDER BY id DESC LIMIT 1), 0)) > 99, 1, @a + 1)
);

Понимаю. Ответ по модулю хорош. Мне это кажется "хрупким", так как не соответствует требованию "100 или более", как указано. Хорошо, если вы измените требование на "Если номер последней записи равен 100, установите номер на 1".

Для меня это более интуитивно понятно:

INSERT INTO numbers (number)
SELECT 
  CASE 
    WHEN number >= 100 THEN 0
    ELSE COALESCE (number, 0)
  END + 1
FROM numbers
ORDER BY id DESC
LIMIT 1
Другие вопросы по тегам