Есть ли способ средствами MySQL проверить нумерацию строк
Формулировка задачи:
Имеется таблица с последовательными номерами без проскоков (1,2,3,....n)
Кол-во строк в таблице должно быть равно максимальному номеру.
Проблема в том, что кладовщик заносит эти номера пальцами и может их менять
напр.
товар№1 - 1
товар№2 - 3
товар№3 - 2
на
товар№1 - 3
товар№2 - 1
товар№3 - 2
Я сделал цикл в php while ($row = $result->fetch()) и SELECT nnn, item FROM items ORDER by nnn и просто проверяю последовательность. Потом SELECT count(0) cnt FROM items и сравниваю макс.номер и кол-во.
Таблица уже около 100тыс, до 30 секунд на проверку.
Есть ли способ проверки выполнить только средствами MySQL и будет ли выигрыш по времени или не стоит возиться?
Заранее спасибо!
Решение задачи: «Есть ли способ средствами MySQL проверить нумерацию строк»
textual
Листинг программы
SELECT items.nnn + 1 FROM items LEFT JOIN items AS n ON items.nnn + 1 = n.nnn WHERE n.nnn IS NULL AND items.nnn < (SELECT MAX(nnn) FROM items)
Объяснение кода листинга программы
Представленный SQL-запрос выполняет следующую задачу: он проверяет последовательность номеров строк в таблице items
и ищет пропущенные номера (то есть номера, которые отсутствуют в последовательности). Вот список действий, которые выполняются в этом запросе:
- SELECT items.nnn + 1
Это действие выбирает все значения из столбца
nnn
таблицыitems
, увеличенные на 1. - FROM items
Здесь указывается, что выборка данных будет производиться из таблицы
items
. - LEFT JOIN items AS n ON items.nnn + 1 = n.nnn
Это действие выполняет внешнее соединение таблицы
items
саму с собой (обозначенной какn
). Оператор ON указывает, что соединение будет выполняться по равенству столбцовnnn
иnnn
. - WHERE n.nnn IS NULL AND items.nnn < (SELECT MAX(nnn) FROM items)
Здесь используется условие WHERE для фильтрации результатов. Первая часть условия (n.nnn IS NULL) означает, что мы ищем строки, которые не имеют соответствующего значения в таблице
n
(то есть пропущенные номера). Вторая часть условия (items.nnn < (SELECT MAX(nnn) FROM items)) означает, что мы ищем пропущенные номера, которые меньше максимального значения в столбцеnnn
. Обратите внимание, что данный запрос предполагает, что номера строк в таблицеitems
начинаются с 1 и увеличиваются на 1 с каждой новой строкой. Если это не так, то запрос может не работать корректно.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д