Любой способ удалить дубликат оператора SELECT?
Для краткости предположим, что у нас есть numbers
таблица с 2 столбцами: id
& number
:
CREATE TABLE numbers(
id INT NOT NULL AUTO_INCREMENT,
NUMBER INT NOT NULL,
PRIMARY KEY ( id )
);
Я хочу number
столбец с автоинкрементом, но перезапуск с 1 после нажатия 100, удовлетворяющий следующим требованиям:
- Если еще нет записей, установите
number
до 1. - Если в таблице уже есть записи:
- Если последняя запись
number
меньше 100, установленоnumber
к этому + 1. - Если последняя запись
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