mysql - 有没有办法在 JOIN 部分的 SELECT FROM (查询)语法中重用子查询?

标签 mysql

我有简单的测试

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/

相关文章:

php - 无法弄清楚这个错误试图告诉我什么

php - 从数据库 Android 列出附近的地点

php - 添加多个表的字段的问题

java - 如何通过托管 bean 显示 MySQL 数据?

MySQL使用同一个表的子查询

php - 5 分钟长轮询示例的简单指南不起作用

mysql - 使用 3.23.58 版本的子查询重写 MySQL 查询

PHP MYSQL : display contents of table then add into another table

mysql - 哪个更有效,DELETE 和 INSERT 或 INSERT 和 UPDATE

MySQL在日期时间字段中创建具有唯一年月日键的表