Есть ли способ средствами 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 и ищет пропущенные номера (то есть номера, которые отсутствуют в последовательности). Вот список действий, которые выполняются в этом запросе:

  1. SELECT items.nnn + 1 Это действие выбирает все значения из столбца nnn таблицы items, увеличенные на 1.
  2. FROM items Здесь указывается, что выборка данных будет производиться из таблицы items.
  3. LEFT JOIN items AS n ON items.nnn + 1 = n.nnn Это действие выполняет внешнее соединение таблицы items саму с собой (обозначенной как n). Оператор ON указывает, что соединение будет выполняться по равенству столбцов nnn и nnn.
  4. 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 с каждой новой строкой. Если это не так, то запрос может не работать корректно.

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

7   голосов , оценка 3.857 из 5
Похожие ответы