У меня есть простой test
стол
CREATE TABLE test (
id INT NOT NULL PRIMARY KEY
);
INSERT INTO test (id) VALUES (1), (2), (3), (6), (8), (9), (12);
И я пытаюсь использовать subselect для добавления номеров строк для каждой строки (не может использовать ROW_NUMBER() или другие хаки из-за версии mysql).
SELECT
tlist.id as 'from',
tlist1.id as 'to'
FROM
(
SELECT
t1.id as id, @row_num := IFNULL(@row_num+1, 1) as num
FROM test as t1
) as tlist
INNER JOIN
(
SELECT
test.id as id, @row_num1 := IFNULL(@row_num1+1, 1) as num
FROM test
) as tlist1 ON tlist.num + 1 = tlist1.num
WHERE tlist.id + 1 < tlist1.id
Проблема в том, что я заставил создать новый подсегмент для каждой строки в запросе INNER JOIN
потому что я не могу делать INNER JOIN tlist as tlist1
поскольку tlist не является реальной таблицей базы данных. Существуют ли способы повторного использования подзапроса tslit?
Существуют ли способы повторного использования подзапроса tslit - Нет, это способ имитации функциональности row_number в mysql, хотя бит ifnull чаще выражается как кросс-соединение, подобное этому -
SELECT
tlist.id as 'from',
tlist1.id as 'to'
FROM
(
SELECT
t.id as id, @row_num := @row_num+1 as num
FROM t cross join (select @row_num:=0) r
) as tlist
INNER JOIN
(
SELECT
t.id as id, @row_num1 := @row_num1+1 as num
FROM t cross join(select @row_num1:=0) r1
) as tlist1 ON tlist.num + 1 = tlist1.num
WHERE tlist.id + 1 < tlist1.id;
Но в этом случае
SELECT T1.ID T1ID ,(SELECT MIN(T2.ID) FROM T T2 WHERE T2.ID > T1.ID) T2ID
FROM T T1
HAVING T1.ID + 1 < T2ID;
может быть достаточно. Но я думаю, что вы действительно пытаетесь установить, есть ли пробелы в id (при условии, что id увеличивается на 1)?