类似博客的上一篇下一篇的功能,sql 怎么设计? - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
请不要在回答技术问题时复制粘贴 AI 生成的内容
hjse7en
V2EX    程序员

类似博客的上一篇下一篇的功能,sql 怎么设计?

  •  1
     
      hjse7en 2014-05-11 21:20:54 +08:00 4844 次点击
    这是一个创建于 4171 天前的主题,其中的信息可能已经有所发展或是发生改变。
    想实现在阅读一篇博文时提供上一篇文章,下一篇文章的链接及标题的功能。现在用的sql是:
    SELECT
    min(id) AS id,
    'next' AS label,
    title AS title
    FROM article
    WHERE id > 33
    AND userId = 4
    UNION
    SELECT
    max(id),
    'pre',
    title
    FROM article
    WHERE id < 33
    AND userId = 4
    ;
    在sql查出来的结果里,用label值判断是上一篇文章还是下一篇文章。这样做感觉不是很好,V友们有没什么更好的方法?
    19 条回复    2014-05-14 00:58:17 +08:00
    Wuvist
        1
    Wuvist  
       2014-05-11 23:04:57 +08:00
    就是分页,只是每页两个项目;你分页时怎么做,这里就怎么做。

    分页查询参考:
    http://www.cnblogs.com/wuvist/archive/2010/03/15/1686267.html

    的风格3.
    cbsw
        2
    cbsw  
       2014-05-11 23:20:39 +08:00
    只用过 Django 自带的分页,具体底层实现不是很清楚
    lincanbin
        3
    lincanbin  
       2014-05-11 23:31:51 +08:00
    多加一条查询太花时间,建议直接加个字段保存上一篇和下一篇的内容。
    然后发布博文和删除时,对可能受影响的记录进行update
    txlty
        4
    txlty  
       2014-05-11 23:35:22 +08:00
    order by id desc / asc 各取一条,也可以。
    kxxoling
        5
    kxxoling  
       2014-05-11 23:42:44 +08:00
    SELECT * FROM table LIMIT 3 OFFSET n-1; 这样?可以获取这篇文章及上下两篇文章,但n必须是本篇文章的rownum。
    kxxoling
        6
    kxxoling  
       2014-05-11 23:50:05 +08:00
    @txlty id不连续怎么办?某些数据库在某行被删除后id依旧会继续增加。
    txlty
        7
    txlty  
       2014-05-12 00:08:22 +08:00
    @kxxoling 我的意思是这样 where id<[当前id] order by id desc limit 0,1
    hjse7en
        8
    hjse7en  
    OP
       2014-05-12 09:26:48 +08:00
    @txlty 这样可以,跟我那种是一样的
    hjse7en
        9
    hjse7en  
    OP
       2014-05-12 09:29:09 +08:00
    @lincanbin 像这种,如果删的记录在中间,那就有两条记录得做更新了
    dong3580
        10
    dong3580  
       2014-05-12 10:19:33 +08:00 via iPhone
    @hjse7en
    不知道楼主问的是哪个SQL?
    我只会MSSQL和Oracle.
    可以这样分页:
    select id,title
    from article
    where userid=4 and id>=1 and id<10
    //动态变化id就达到分页了.
    至于上一篇上一篇,肯定是点进这个页面之后才有的呀,
    例如点进 id为10的页面,在url里面可以加上: xxx.aspx?id=10
    那么他的
    上一篇就是xxx.aspx?id=9
    下一篇就是xxx.aspx?id=11
    另外就是union尽量少用,
    blogphp230com
        11
    blogphp230com  
       2014-05-12 11:51:16 +08:00
    根据文章ID或者文章发布时间来获取
    上一篇:where id<123 order by id desc limit 1
    下一篇:where id>123 order by id sac limit 1
    hjse7en
        12
    hjse7en  
    OP
       2014-05-12 13:21:23 +08:00
    @dong3580 id 不一定是连续的,中间可能有间隔.使用union是想只执行一次查询就可以获得结果,其实这里用union all就可以.
    dong3580
        13
    dong3580  
       2014-05-12 14:30:47 +08:00
    @hjse7en
    如果id不连续,你上面的所谓语句确定没问题?
    不连续那就查询两次呗,个人建议像这种非复杂的查询不要使用union之类的高级功能,看你自己吧.
    如果是oracle就用rownum,更简单;
    如果是MSSQL用row_number一样啊.

    select pageid,id,title
    from(
    select row_number() pageid,id,title
    from article
    where userid=4
    )
    where pageid>=1 and pageid<10
    PS:我现在没法用mssql工具,语句类似上面的.
    dong3580
        14
    dong3580  
       2014-05-12 14:32:27 +08:00
    @hjse7en
    另外rownum,row_number()压根与id没关系,所以你删除不删除文章没影响吧.
    hjse7en
        15
    hjse7en  
    OP
       2014-05-12 21:13:26 +08:00
    @dong3580 id是自增长的,这里查出来的结果是根据user过滤的,所有有可能一个用户下,上一篇文章跟下一篇文章中间有几个间隔id是别的用户的。
    dong3580
        16
    dong3580  
       2014-05-13 13:01:52 +08:00
    @hjse7en
    RT,我上面不是重复了么?
    加个where不就好了,rownum,row_number()与id毛的关系,
    dong3580
        17
    dong3580  
       2014-05-13 13:20:06 +08:00
    @hjse7en
    遇到这样的sql只需要多查两次,
    第一次查询 [得到想要的数据(这里可以考虑where,实在太复杂可以在里面再加个select查询)] 并且 [排序(可以用order by排序,group by分组,或者over分组)] ,
    第二次再第一次的基础上取出想要的数据,还是很简单的。
    基本上都是大同小异。
    lincanbin
        18
    lincanbin  
       2014-05-14 00:57:22 +08:00
    @hjse7en 所以删除和发布页面都要做一次Update,这样对服务器资源还有稍微有点节省作用的。
    lincanbin
        19
    lincanbin  
       2014-05-14 00:58:17 +08:00
    @dong3580 你想优化这条语句,无非就是想节约服务器资源,照我说的那样做,空间换时间,多划算啊。
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     974 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 27ms UTC 18:59 PVG 02:59 LAX 11:59 JFK 14:59
    Do have faith in what you're doing.
    ubao snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86