MySQ同列相邻行操作

一、mysql数据库表
在这里插入图片描述
二、 方法

  1. 采用自身连接,但是这只能用于同行。(行不通)
  2. 采用变量(行不通)
  3. 采用临时表 (行不通)
  4. 不在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);

  1. 采用ROW_NUMBER()分窗函数,需要MySQL8.0以上(推荐)
  2. 采用变量+临时表得到序号列,采用序号列相差一操作 (复杂)
    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

三、扩展

  1. MySQL变量的赋值
    set中可以@a=1或者@a:=1
    但是select中只能是@a:=1

  2. MySQL定义变量
    set @a=1

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值