Mysql 在新列中获取以前的列值

Mysql 在新列中获取以前的列值,mysql,sql,Mysql,Sql,我有下表,命名为示例: col1 ---------- 101 102 103 104 我想在下面的结果现有列中添加一个结果 col1 newcol --------------- 101 0/''/null 102 101 103 102 104 103 SELECT COL1, @a := @a AS col2 FROM MYTABLE JOIN (SELECT @a := 0) t ORDER BY COL1

我有下表,命名为示例:

 col1   
 ----------
 101   
 102   
 103   
 104   
我想在下面的结果现有列中添加一个结果

col1   newcol
---------------
 101   0/''/null
 102   101
 103   102
 104   103


 SELECT COL1, @a := @a AS col2
 FROM MYTABLE JOIN (SELECT @a := 0) t
 ORDER BY COL1;
我可以在对应的第二列中获得上一列的值吗 对于第一列,您可以使用保存最后一列

SELECT T1.`col1` AS col1,
(IFNULL(T2.`col2`,0)) AS new_col
FROM
table_name T1 LEFT JOIN table_name T2 ON T1.`col1`=(T2.`col1` - 1)
SELECT @a as Prev, @a:=COL1 as Current
FROM MYTABLE
ORDER BY COL1;
您可以在中找到更多信息

我希望你会觉得它有用

编辑:

删除了@a的初始化语句:

SET @a=0;
@a的第一个值将为空

您可以使用a保存最后一个值

SELECT @a as Prev, @a:=COL1 as Current
FROM MYTABLE
ORDER BY COL1;
您可以在中找到更多信息

我希望你会觉得它有用

编辑:

删除了@a的初始化语句:

SET @a=0;

@a的第一个值将为NULL

这有点复杂,但下面将处理它:

SELECT COL1,
       (CASE WHEN (@oldprev := @prev) = NULL THEN NULL -- NEVER HAPPENS
             WHEN (@prev := col1) = NULL THEN NULL     -- NEVER HAPPENS
             ELSE @oldprev
        END) as prevcol
FROM MYTABLE CROSS JOIN
     (SELECT @prev := 0) params
ORDER BY COL1;

注意:oldprev不需要初始化,因为它的值只在case中使用。

这有点复杂,但下面处理它:

SELECT COL1,
       (CASE WHEN (@oldprev := @prev) = NULL THEN NULL -- NEVER HAPPENS
             WHEN (@prev := col1) = NULL THEN NULL     -- NEVER HAPPENS
             ELSE @oldprev
        END) as prevcol
FROM MYTABLE CROSS JOIN
     (SELECT @prev := 0) params
ORDER BY COL1;

注意:oldprev不需要初始化,因为它的值只在案例中使用。

您可以使用相关子查询进行初始化:

SELECT col1, (SELECT col1 
              FROM mytable AS t2
              WHERE t2.col1 < t1.col1
              ORDER BY col1 DESC LIMIT 1) AS newcol
FROM mytable AS t1     

注意:只要col1不包含任何重复项,查询就可以工作。

您可以使用相关子查询:

SELECT col1, (SELECT col1 
              FROM mytable AS t2
              WHERE t2.col1 < t1.col1
              ORDER BY col1 DESC LIMIT 1) AS newcol
FROM mytable AS t1     

注意:只要col1不包含任何重复项,查询就可以工作。

如何确定上一列是什么?数字排序?@amber,基于其他列,值将显示如下,是数字存储如何确定上一列是什么?数字排序?@amber,根据其他列,值将如下显示,yes Numerical storedMySQL特别警告不要在同一选择中的不同表达式中使用和分配变量。而且,事实上,有时这不起作用,因为计算的顺序不能保证。。从MYTABLE中选择@a作为Prev,@a:=COL1作为Current,选择@a:=0 x ORDER BY COL1;谢谢@Gordon Linoff谢谢@David IslaThis仍然有问题:您正在同一选择中设置并使用@a变量。哦..好的..无论如何..谢谢@Giorgos Betsos,会处理好的this@GiorgosBetsos嗯。。。我明白了…那么我需要更多地了解这种行为。。谢谢你们!投票给戈登;MySQL特别警告不要在同一个select中的不同表达式中使用和分配变量。而且,事实上,有时这不起作用,因为计算的顺序不能保证。。从MYTABLE中选择@a作为Prev,@a:=COL1作为Current,选择@a:=0 x ORDER BY COL1;谢谢@Gordon Linoff谢谢@David IslaThis仍然有问题:您正在同一选择中设置并使用@a变量。哦..好的..无论如何..谢谢@Giorgos Betsos,会处理好的this@GiorgosBetsos嗯。。。我明白了…那么我需要更多地了解这种行为。。谢谢你们!投票给戈登;T2.col1-1可能不起作用,因为它不是必需的值将是串行的,是的,在示例中它显示为串行100101102。。但是实时可能是201101502302…T2.col1-1可能不起作用,因为它没有必要值是串行的,是的,在示例中串行显示100101102。。但实时可能是201101502302。。。