一、mysql数据库表
二、 方法
- 采用自身连接,但是这只能用于同行。(行不通)
- 采用变量(行不通)
- 采用临时表 (行不通)
- 不在MySQL中处理,而在Java处理(推荐)
List<Score> list = helloDao.getList(); //从数据库获取数据
for(int i=0;i<list.size();i++){
if(i==0){
list.get(i).setTwo(list.get(i).getNumber());
}else{
list.get(i).setTwo(list.get(i).getNumber()+list.get(i-1).getNumber());
}
}
list.forEach(System.out::println);
- 采用ROW_NUMBER()分窗函数,需要MySQL8.0以上(推荐)
- 采用变量+临时表得到序号列,采用序号列相差一操作 (复杂)
1、问题:第一个怎么办,采用case when then else end解决
2、成功案例
//定义变量,注意临时表中的a和b是从1开始
SET @a=0;
SET @b=0;
//查询语句
SELECT
(CASE
WHEN a.sc=1 AND b.sc=1 THEN //注意条件是a.sc=1 AND b.sc=1,而不是其中一个
a.number
ELSE
a.number+b.number
END ) as tow
FROM
(SELECT number,(@a:=@a+1) AS sc
FROM score
ORDER BY number) a ,(SELECT number,(@b:=@b+1) AS sc
FROM score
ORDER BY number) b
WHERE (a.sc=1 and b.sc=1) or a.sc=b.sc-1 //两表连接是笛卡尔运算,注意条件是a.sc=1 and b.sc=1
三、扩展
-
MySQL变量的赋值
set中可以@a=1或者@a:=1
但是select中只能是@a:=1 -
MySQL定义变量
set @a=1