我有简单的测试
表
CREATE TABLE test (
id INT NOT NULL PRIMARY KEY
);
INSERT INTO test (id) VALUES (1), (2), (3), (6), (8), (9), (12);
我正在尝试使用 subselect 为每行添加行号(由于 mysql 版本的原因,无法使用 ROW_NUMBER() 或其他 hack)。
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 子查询 - 不,这是一种在 mysql 中模拟 row_number 功能的方法,尽管 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)?
关于mysql - 有没有办法在 JOIN 部分的 SELECT FROM (查询)语法中重用子查询?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48973635/