免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 12833 | 回复: 10
打印 上一主题 下一主题

如何用sql实现表中相邻记录依次做减法操作? [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2008-10-14 16:58 |只看该作者 |倒序浏览
mysql数据库中的记录,有一个INT字段以前存储的是累加值,现在需要修改为存储差值,就是说要用后一条的值现在要减去前一条的值,请问有没有一条SQL语句就可以实现?

论坛徽章:
0
2 [报告]
发表于 2008-10-14 17:29 |只看该作者

回复 #1 liusz 的帖子

后一条跟前一条之前有没有字段可以唯一确定,比如自增并且没有中断的主键,如果有,可以用主键=主键-1做为连接条件跟本表连接求差值

论坛徽章:
0
3 [报告]
发表于 2008-10-14 17:59 |只看该作者
原帖由 denniswwh 于 2008-10-14 17:29 发表
后一条跟前一条之前有没有字段可以唯一确定,比如自增并且没有中断的主键,如果有,可以用主键=主键-1做为连接条件跟本表连接求差值



有ID,主键,但是不熟悉链接查询语法,能给个例子吗?

论坛徽章:
0
4 [报告]
发表于 2008-10-14 18:00 |只看该作者
原帖由 liusz 于 2008-10-14 17:59 发表



有ID,主键,但是不熟悉链接查询语法,能给个例子吗?



比如: update table_name set col_1 = col_1 ...

论坛徽章:
0
5 [报告]
发表于 2008-10-15 07:26 |只看该作者
原帖由 denniswwh 于 2008-10-14 17:29 发表
后一条跟前一条之前有没有字段可以唯一确定,比如自增并且没有中断的主键,如果有,可以用主键=主键-1做为连接条件跟本表连接求差值



那就搞一个临时表,再搞一下不能中断的主键就行了。

论坛徽章:
0
6 [报告]
发表于 2008-10-15 10:11 |只看该作者
原帖由 yueliangdao0608 于 2008-10-15 07:26 发表



那就搞一个临时表,再搞一下不能中断的主键就行了。



这个思路是可以,问题是我不会写这样的SQL语句,能给个例子吗? 假设表中就两个字段,ID, COUNTER, ID 是不能中断的主键,COUNTER是累加字段。

论坛徽章:
0
7 [报告]
发表于 2008-10-15 20:48 |只看该作者
原帖由 yueliangdao0608 于 2008-10-15 07:26 发表



那就搞一个临时表,再搞一下不能中断的主键就行了。



yueliangdao0608 , denniswwh  到底有没有这样的SQL语句啊?我查找了MYSQL手册,没有找到。 能给个例子吗?

论坛徽章:
0
8 [报告]
发表于 2008-10-16 09:13 |只看该作者
create table test (id int,counter int)


insert into test(id,counter) values(1,3 )
insert into test(id,counter) values(2,4 )
insert into test(id,counter) values(3,6 )
insert into test(id,counter) values(4,9 )
insert into test(id,counter) values(5,13 )
insert into test(id,counter) values(6,18 )
insert into test(id,counter) values(7,24 )
insert into test(id,counter) values(8,31 )
insert into test(id,counter) values(9,39 )
insert into test(id,counter) values(10,49 )
insert into test(id,counter) values(11,53 )
insert into test(id,counter) values(12,58 )

select a.id, b.counter - a.counter
from test a
,test b
where a.id = b.id -1

给你例子,你看看是不是你想要得。

论坛徽章:
0
9 [报告]
发表于 2008-10-16 09:32 |只看该作者
原帖由 andylei 于 2008-10-16 09:13 发表
create table test (id int,counter int)


insert into test(id,counter) values(1,3 )
insert into test(id,counter) values(2,4 )
insert into test(id,counter) values(3,6 )
insert into test(id,co ...



谢谢, 这个正是我想要的。 :-)

因为我连10%的DBA都算不上,所以稍微复杂点的语句都没有办法。 能推荐个类似技巧的文章吗? 我这两天GOOGLE了许多时间都没有找到。

论坛徽章:
0
10 [报告]
发表于 2008-10-16 12:48 |只看该作者
原帖由 liusz 于 2008-10-16 09:32 发表



谢谢, 这个正是我想要的。 :-)

因为我连10%的DBA都算不上,所以稍微复杂点的语句都没有办法。 能推荐个类似技巧的文章吗? 我这两天GOOGLE了许多时间都没有找到。


我用上面的语句吧这个记录写道新表中去了。

还有一点问题,继续求教:

第一条记录的值是没有做过减法运算的,所以第一条的值(可能很大)就不能保留了,删除第一条的值。
我用的语句:

mysql> delete from test as a where a.id=(select min(b.id) from test as b  );

出错信息:
ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'as a where a.id=(select min(b.id) from test as b  )' at line 1

请问这个语句应该如何写?
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP