一段 sql 求帮助

2016-10-31 22:19:37 +08:00
 yang2yang
假设有下面一张表:命名为 stu 好了,如下
id name goal
1 a 10
2 b 8
5 c 6
9 d 9
使用一段 sql 能够变成如下这个样子:
id name goal next
1 a 10 8
2 b 8 6
5 c 6 9
9 d 9 null
不知道 v 友看懂了没有?就是想要用一段 sql 实现按 id 排序之后,把下一个记录的 goal 添加到上一个记录的 next 里面,也就是要按这种规则添加一列。
想了一晚上,唯一想到的就是用子查询这点思路了,但是还是想不通,,诚心求帮助。
2383 次点击
所在节点    程序员
17 条回复
mooncakejs
2016-10-31 22:27:15 +08:00
不如查出来程序拼接
yang2yang
2016-10-31 22:34:29 +08:00
@mooncakejs 不好意思,并不行呀,要能用程序,我就不开这主题了。。
gsls200808
2016-10-31 22:45:35 +08:00
update 里套一个 select,用 order 排序,用 limit 指定行,差不多可以了
chaegumi
2016-10-31 22:45:41 +08:00
select A.*,(select B.goal from stu B where B.id>A.id order by B.id asc limit 1) as next from stu A order by A.id asc
jydeng
2016-10-31 22:47:12 +08:00
这个需求有做过类似的,用了一种不完美的办法:
1 、你可以查询两次,在已排序的结果上增加一个 rownum ,得到结果集 a,b ;
2 、用 rownum 做为管理条件( rownum = rownum + 1 ),用左连接关联两次查询的结果;
3 、稍微筛选一下,就能得到你要的结果了, a.id,a.name,a.goal,b.goal 、
不过有个问题,就是最后一条记录会有问题, next 会取不到值,没想到更好的办法了
reus
2016-10-31 22:54:51 +08:00
select *, (select goal from stu where id > s0.id order by id asc limit 1) as next from stu s0 order by s0.id asc;

goal 有索引的话,效率不低的。
reus
2016-10-31 22:55:36 +08:00
错了是 id 索引……
shiji
2016-10-31 23:03:09 +08:00
这个倒霉就倒霉在 ID 不连续上面了
ivvei
2016-10-31 23:46:15 +08:00
先说你是什么数据库,数据库不一样支持的 SQL 也不同的。不说数据库怎么弄……

像 Oracle 的话,一个分析函数可以搞定。
yang2yang
2016-10-31 23:51:33 +08:00
@ivvei 额,好吧。。,我是 mysql
Layne
2016-10-31 23:58:14 +08:00
@yang2yang 第一反应就是「这不一个 lead() 函数就搞定了么」,然后看到了你在 10 楼的回复…
maskerTUI
2016-11-01 00:53:49 +08:00
为什么 ID 会是不连续的呢
Layne
2016-11-01 01:09:59 +08:00
@maskerTUI 要么不是用 auto_increment 而是在程序里处理,要么存在物理删除
fuxkcsdn
2016-11-01 01:19:35 +08:00
@Layne 也有可能插入失败导致的
nullp
2016-11-01 13:01:04 +08:00
SELECT
t1.rowno1,t1.id,t1.name,t1.goal, t2.goal AS next
FROM
(
SELECT
(@rowNO := @rowNo + 1) AS rowno1,
a.*
FROM
(SELECT * FROM stu) a,
(SELECT @rowNO := 0) b
) t1
LEFT JOIN (
SELECT
(@rowNO2 := @rowNo2 +1)-1 AS rowno2,
a.*
FROM
(SELECT * FROM stu) a,
(SELECT @rowNO2 := 0) b
) t2 ON t1.rowno1 = t2.rowno2
alexnone
2016-11-01 14:56:25 +08:00
@ivvei 请问是什么分析函数?
JerryV2
2016-11-01 16:10:56 +08:00
看 11 楼

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/316916

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX