有一个类别下的新闻列表,  是严格按照时间大--》小顺序排列,然后在时间同样的情况下 再,按照ID 大 ---》 小排列。类似这样: select * from news order by  newsTime desc,newsId desc
下面我想通过一个给定的新闻ID, 获取这个新闻的上一篇,和下一篇  怎么做比较精确??

解决方案 »

  1.   

    下一条
    select top 1 * from news 
    where newsTime<(select newsTime from news where newsId=@Id)
    order by  newsTime desc,newsId desc上一条
    select top 1 * from news 
    where newsTime>(select newsTime from news where newsId=@Id)
    order by  newsTime asc,newsId asc
      

  2.   


    --创建存储过程:
    create    proc p_tb_waynews
    @id bigint
    as
      select px=identity(int,1,1),* into # from 
      (select top 100 percent * FROM news   order  by  newsTime  desc,newsId  desc)c   select a.*,
      bid=isnull(b.id,0),--上一篇的id
      nid=isnull(c.id,0) --下一篇的id
      from # a left join # b on b.px=a.px-1 
      left join # c on c.px=a.px+1 where a.id=@id
      

  3.   


    --调用就行了:
    exec p_tb_waynews 3
      

  4.   

    下一条 
    select  top  1  *  from  news  
    where  newsTime <(select  newsTime  from  news  where  newsId=@Id) 
    order  by    newsTime  desc,newsId  desc 上一条 
    select  top  1  *  from  news  
    where  newsTime> (select  newsTime  from  news  where  newsId=@Id) 
    order  by    newsTime  asc,newsId  asc 
    --创建存储过程:
    create    proc p_tb_waynews
    @id bigint
    as
      select px=identity(int,1,1),* into # from 
      (select top 100 percent * FROM news   order  by  newsTime  desc,newsId  desc)c   select a.*,
      bid=isnull(b.id,0),--上一篇的id
      nid=isnull(c.id,0) --下一篇的id
      from # a left join # b on b.px=a.px-1 
      left join # c on c.px=a.px+1 where a.id=@id
    --调用就行了:
    exec p_tb_waynews 3都可以
      

  5.   

    如果是mssql数据库的话。
    如果是mysql数据库的话。select * from news order by newsTime desc,newsId desc limit 1;select * from news order by newsTime asc,newsId asc limit 1;
    oracle 忘了 大同小异吧。你试试看,希望对你有帮助。