V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
yang2yang
V2EX  ›  程序员

一段 sql 求帮助

  •  
  •   yang2yang ·
    yang2yang · 2016-10-31 22:19:37 +08:00 via Android · 2371 次点击
    这是一个创建于 2745 天前的主题,其中的信息可能已经有所发展或是发生改变。
    假设有下面一张表:命名为 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 里面,也就是要按这种规则添加一列。
    想了一晚上,唯一想到的就是用子查询这点思路了,但是还是想不通,,诚心求帮助。
    17 条回复    2016-11-01 16:10:56 +08:00
    mooncakejs
        1
    mooncakejs  
       2016-10-31 22:27:15 +08:00 via iPhone
    不如查出来程序拼接
    yang2yang
        2
    yang2yang  
    OP
       2016-10-31 22:34:29 +08:00 via Android
    @mooncakejs 不好意思,并不行呀,要能用程序,我就不开这主题了。。
    gsls200808
        3
    gsls200808  
       2016-10-31 22:45:35 +08:00 via Android   ❤️ 1
    update 里套一个 select,用 order 排序,用 limit 指定行,差不多可以了
    chaegumi
        4
    chaegumi  
       2016-10-31 22:45:41 +08:00   ❤️ 1
    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
        5
    jydeng  
       2016-10-31 22:47:12 +08:00   ❤️ 1
    这个需求有做过类似的,用了一种不完美的办法:
    1 、你可以查询两次,在已排序的结果上增加一个 rownum ,得到结果集 a,b ;
    2 、用 rownum 做为管理条件( rownum = rownum + 1 ),用左连接关联两次查询的结果;
    3 、稍微筛选一下,就能得到你要的结果了, a.id,a.name,a.goal,b.goal 、
    不过有个问题,就是最后一条记录会有问题, next 会取不到值,没想到更好的办法了
    reus
        6
    reus  
       2016-10-31 22:54:51 +08:00   ❤️ 1
    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
        7
    reus  
       2016-10-31 22:55:36 +08:00
    错了是 id 索引……
    shiji
        8
    shiji  
       2016-10-31 23:03:09 +08:00
    这个倒霉就倒霉在 ID 不连续上面了
    ivvei
        9
    ivvei  
       2016-10-31 23:46:15 +08:00
    先说你是什么数据库,数据库不一样支持的 SQL 也不同的。不说数据库怎么弄……

    像 Oracle 的话,一个分析函数可以搞定。
    yang2yang
        10
    yang2yang  
    OP
       2016-10-31 23:51:33 +08:00 via Android
    @ivvei 额,好吧。。,我是 mysql
    Layne
        11
    Layne  
       2016-10-31 23:58:14 +08:00
    @yang2yang 第一反应就是「这不一个 lead() 函数就搞定了么」,然后看到了你在 10 楼的回复…
    maskerTUI
        12
    maskerTUI  
       2016-11-01 00:53:49 +08:00 via Android
    为什么 ID 会是不连续的呢
    Layne
        13
    Layne  
       2016-11-01 01:09:59 +08:00
    @maskerTUI 要么不是用 auto_increment 而是在程序里处理,要么存在物理删除
    fuxkcsdn
        14
    fuxkcsdn  
       2016-11-01 01:19:35 +08:00 via iPhone
    @Layne 也有可能插入失败导致的
    nullp
        15
    nullp  
       2016-11-01 13:01:04 +08:00   ❤️ 1
    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
        16
    alexnone  
       2016-11-01 14:56:25 +08:00
    @ivvei 请问是什么分析函数?
    JerryV2
        17
    JerryV2  
       2016-11-01 16:10:56 +08:00
    看 11 楼
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   980 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 28ms · UTC 21:05 · PVG 05:05 · LAX 14:05 · JFK 17:05
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.