Вопрос или проблема
Как я могу выбрать все строки рядом со строкой, соответствующей условию? Но учитывая, что нет последовательного 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 Запрос
Для достижения этого результата мы можем использовать такие шаги:
- Создать временную таблицу с индексами строк.
- Получить индекс строк, где
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);
Объяснение запроса
-
Инициализация переменной: С помощью
SET @row_num := 0;
мы создаём счетчик, который будет использоваться для нумерации строк. -
Удаление временных таблиц: Это необходимо для избежания конфликта имён, если вы запускаете запрос несколько раз.
-
Создание временной таблицы
t1
: Здесь происходит выборка данных из исходной таблицыnumbers
с добавлением индекса. Каждой строке присваивается номер, начиная с 1. -
Создание временной таблицы
t2
: Здесь мы выбираем все номера строк, которые идут сразу после строк сN1 = 9
. -
Основной запрос: На последнем этапе мы выбираем нужные строки из первой временной таблицы, проверяя, присутствует ли их индекс во второй временной таблице.
Заключение
Используя данный метод с временными таблицами и переменными, вы можете эффективно получать строки, следующие за заданным значением, даже в случае, если идентификаторы не являются последовательными. Этот подход подходит для работы с большими данными и меняющимися таблицами.
Для получения дополнительной информации о временных таблицах и более сложных манипуляциях с данными стоит ознакомиться с официальной документацией MySQL и другими ресурсами, связанными с SQL-запросами.