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

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

  •  1
     
  •   hjse7en · 2014-05-11 21:20:54 +08:00 · 4492 次点击
    这是一个创建于 3855 天前的主题,其中的信息可能已经有所发展或是发生改变。
    想实现在阅读一篇博文时提供上一篇文章,下一篇文章的链接及标题的功能。现在用的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   ·   实用小工具   ·   2907 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 27ms · UTC 02:59 · PVG 10:59 · LAX 18:59 · JFK 21:59
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.