Mysql 在连接部分的SELECT FROM(查询)语法中是否有重用子查询的方法?

Mysql 在连接部分的SELECT FROM(查询)语法中是否有重用子查询的方法?,mysql,Mysql,我有一个简单的测试表 我正在尝试使用subselect为每一行添加行号,但由于mysql版本的原因,无法使用row_NUMBER或其他破解 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 (

我有一个简单的测试表

我正在尝试使用subselect为每一行添加行号,但由于mysql版本的原因,无法使用row_NUMBER或其他破解

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
问题是,我强制为内部联接查询中的每一行创建新的subselect,因为我不能像tlist1那样执行内部联接tlist,因为tlist不是真正的数据库表。有什么方法可以重用tslit子查询吗?

有什么方法可以重用tslit子查询吗?没有,这是一种在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增加1,那么id中是否有任何间隙?

在MySQL 8.0中,有一种方法可以重用子查询,称为CTS公共表表达式。但是MySQL 8.0还没有准备好生产。在较低的MySQL版本中,没有办法重用子查询谢谢,CTE是一种有趣的语法,将等待8.0,但目前正在尝试在MySQL 5.6中找到解决方案,期望的结果会是什么样的眼睛,你是对的,我正在尝试在ids序列中找到跳过。
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;