Используйте MySQL, чтобы выбрать следующую запись после совпадающего значения без последовательного RowID.

Вопрос или проблема

Как я могу выбрать все строки рядом со строкой, соответствующей условию? Но учитывая, что нет последовательного RowID, как поле ID.

Вот структура таблицы с 10 строками, но количество строк будет увеличиваться в будущем.

Простой текст:

ID      Дата        N1
1     ДатаВремя    9  
2     ДатаВремя    2
3     ДатаВремя    5
4     ДатаВремя    9
5     ДатаВремя    3
6     ДатаВремя    6
7     ДатаВремя    7
8     ДатаВремя    9
20    ДатаВремя    3 // Последовательность нарушена
21    ДатаВремя    9

Примечание:
Строка “ДатаВремя” просто символическая, это может быть любая дата и время.

Я пытаюсь узнать первое N1 число после числа: 9

Я пробовал несколько способов, но результат не то, что мне нужно.

Ожидаемый результат:

ID      Дата        N1
2     ДатаВремя      2
5     ДатаВремя      3
20    ДатаВремя      3

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

Вы можете создать две временные таблицы, одна из которых будет использовать переменную @row_num, создавая индекс на каждое число строки и будет увеличиваться на единицу независимо от значений RowID. Затем из этой временной таблицы вы выберете row_num+1, где значение N1 равно 9. Далее вы выбираете столбцы id и N1 явно, где значения row_num совпадают, что даст вам желаемый результат.

SQL запрос

SET @row_num:=0;
DROP TABLE IF EXISTS t1;
CREATE TEMPORARY TABLE t1 (SELECT @row_num:=@row_num+1 AS row_num, id, N1 FROM numbers);

DROP TABLE IF EXISTS t2;
CREATE TEMPORARY TABLE t2 (Select row_num+1 as row_num FROM t1 WHERE N1 = 9);

SELECT id, N1 FROM t1
WHERE row_num IN (Select * From t2);

Подтверждение

Select * From Numbers (RowID равный 5 здесь отсутствует)

введите описание изображения здесь

Выше SQL запрос

введите описание изображения здесь


Дополнительные ресурсы

Ответ или решение

Как выбрать строки после совпадения значения в MySQL без последовательного RowID

Если вы работаете с таблицей в MySQL, в которой значения идентификаторов не идут последовательно, и вам нужно выбрать записи, следующие за определённым значением, например, следующим за N1 = 9, вы можете воспользоваться временными таблицами и переменными для создания временной индексации строк. Приведем подробное решение данной задачи.

Структура таблицы

Предположим, у нас есть таблица с таким содержанием:

ID      Date        N1
1     DateTime    9  
2     DateTime    2
3     DateTime    5
4     DateTime    9
5     DateTime    3
6     DateTime    6
7     DateTime    7
8     DateTime    9
20    DateTime    3
21    DateTime    9

Цель запроса

Для выполнения задачи нужно выбрать все строки, у которых значения N1 идут сразу после последней строки с N1 = 9. Ожидаемым результатом будет:

ID      Date        N1
2     DateTime      2
5     DateTime      3
20    DateTime      3

SQL Запрос

Для достижения этого результата мы можем использовать такие шаги:

  1. Создать временную таблицу с индексами строк.
  2. Получить индекс строк, где N1 = 9, и выбрать строки с индексами, следующими за найденными.

Вот SQL-запрос, который выполняет вышеописанные действия:

-- Инициализируем переменную для нумерации строк
SET @row_num := 0;

-- Удаляем временные таблицы, если они существуют
DROP TABLE IF EXISTS t1;
DROP TABLE IF EXISTS t2;

-- Создаём временную таблицу с индексами строк
CREATE TEMPORARY TABLE t1 AS 
SELECT @row_num := @row_num + 1 AS row_num, ID, N1 
FROM numbers;

-- Создаём вторую временную таблицу, чтобы выбрать индексы строк, которые идут сразу после 9
CREATE TEMPORARY TABLE t2 AS 
SELECT row_num + 1 AS row_num 
FROM t1 
WHERE N1 = 9;

-- Выбираем ID и N1 из первой таблицы, где row_num присутствуют во второй таблице
SELECT ID, N1 FROM t1 
WHERE row_num IN (SELECT row_num FROM t2);

Объяснение запроса

  1. Инициализация переменной: С помощью SET @row_num := 0; мы создаём счетчик, который будет использоваться для нумерации строк.

  2. Удаление временных таблиц: Это необходимо для избежания конфликта имён, если вы запускаете запрос несколько раз.

  3. Создание временной таблицы t1: Здесь происходит выборка данных из исходной таблицы numbers с добавлением индекса. Каждой строке присваивается номер, начиная с 1.

  4. Создание временной таблицы t2: Здесь мы выбираем все номера строк, которые идут сразу после строк с N1 = 9.

  5. Основной запрос: На последнем этапе мы выбираем нужные строки из первой временной таблицы, проверяя, присутствует ли их индекс во второй временной таблице.

Заключение

Используя данный метод с временными таблицами и переменными, вы можете эффективно получать строки, следующие за заданным значением, даже в случае, если идентификаторы не являются последовательными. Этот подход подходит для работы с большими данными и меняющимися таблицами.

Для получения дополнительной информации о временных таблицах и более сложных манипуляциях с данными стоит ознакомиться с официальной документацией MySQL и другими ресурсами, связанными с SQL-запросами.

Оцените материал
Добавить комментарий

Капча загружается...