• 【原创】对文章分类的数据提取


    1、发表缘由:

      做一个类似于博客的文章系统,其中里面有一个文章模块,在后者是用标签来添加分类的新闻的,比如:操作指引(classId=1),活动动态(classId=2),博主文章(classId=3)等等,其中博主文章是博主发布的,操作指引,活动动态等,是在系统管理后台发布的,并且都有一个置顶和前台推荐的的功能,就是在数据库中有个字段标识是否推荐,现在首页要求取某个分类的前n条,其中m(n>m)条是按是否推荐字段(TopNum),剩下的简单的将数据表设计一下,表结构如下:

     

    id为表的索引,o,tiele应该是title,写错了,是标题,内容,分类,推荐值,用户编号,增加时间,在首页的话可以将提取出来的信息显示出来,作为一个引导作用,将用户引导到子页面。又有一个页面对应的分类有20条数据,也是按照这种要求进行提取,所以就需要一个统一的方法对这个表的数据进行提取。

     

    2、思路:

      有了需求,就得想个办法,由于之前写过一个分页的存储过程,想能不能将这个需求结合分页的存储过程加以整合呢,所以就将上表所需的东西按需求房子一张临时表中,将这个临时表作为分页存储过程的主表,做到完美结合,结合需求,将参数整出来,参数如下:

    @classId nvarchar(10),--文章分类(eg:1,2,3,4..)
    @topNum int,--选取topNum=?的置顶条数
    @isTopNum nvarchar(100),--TopNum是置顶的值,TopNum=1(前台推荐),TopNum=2(置顶).....
    @selectTopNum nvarchar(100),--总共获取多少条数

    @TotalPage int output,--总页数
    @RowsCount int output,--总条数
    @PageSize int,--每页显示数据
    @CurrentPage int--当前分页

    因为这个存储过程是结合特定的表而写的,所以没有对所需数据字段做什么参数,需要什么数据直接在存储过程里面直接定义就行了,如果selectTopNum的值为0的话,后面的分页参数就起作用了,不然分页就不起作用,就直接提前前面几条数据,这样就做到了通用,呵呵!

    3、代码:

      最后将代码发布一下,供园子里的朋友们参考,当然,我个人更希望得到园友们的指点,以便提高,代码如下:

    代码
      1 --获取文章表(article)中获取某?条记录,条件为指定分类(classid),指定行为(isTop=?)的前topNum条,剩下的按增加时间排序
      2 CREATE PROCEDURE selectTopN 
      3 
      4 @classId nvarchar(10),--文章分类(eg:1,2,3,4..)
      5 @topNum int,--选取istop=?的置顶条数
      6 @isTopNum nvarchar(100),--isTop是置顶的值,isTop=1(前台推荐),isTop=2(置顶).....
      7 @selectTopNum nvarchar(100),--总共获取多少条数
      8 
      9 @TotalPage int output,
     10 @RowsCount int output,
     11 @PageSize int,
     12 @CurrentPage int
     13 As
     14 
     15 Begin
     16       --print @PageSize
     17      declare @RecordCount float
     18      declare @PageNum int --分页依据数
     19      Declare @TemSql nvarchar(1000)
     20      Declare @nRd int
     21      declare @afterRows int
     22      declare @tempTableName nvarchar(10)
     23 
     24      declare @sql nvarchar(200)
     25      declare @topClassNum nvarchar(100)
     26      declare @selectNum nvarchar(100)
     27      declare @stringStr nvarchar(100)
     28 
     29 set @selectNum=cast@selectTopNum as int)
     30 --print @classId
     31 set @stringStr=' classId='+@classId
     32 set @isTopNum=' isTop='+@isTopNum
     33 set @topClassNum=' top '+cast@topNum as varchar(20))
     34 set @selectTopNum=' top '+  cast@selectTopNum as varchar(20))
     35 
     36  --create temp table begin
     37  set @sql=' create table t#  (tid int identity(1,1) ,id int  ,title nvarchar(100),userId int,classId int,isTop int  )'
     38  --print @sql
     39  exec sp_executeSql  @sql
     40   set @sql=' insert into  t#   (id,title,userid,classid,istop) select ' +@topClassNum+' [id],title,userId,classId,isTop from article  where '+ @stringStr+'  and isTop =1 order by addTime desc '
     41  --print @sql
     42  exec sp_executeSql  @sql
     43  
     44  declare @rCount int select @rCount=count(1from t#
     45  --set @rCount=20-@rCount
     46  --print @rCount
     47  if(@rCount<@topNum
     48  begin  delete from t# 
     49  set @sql=' insert into t#(id,title,userid,classid,istop) select  [id],title,userId,classId,isTop from article  where ' + @stringStr+' and istop<'+cast(@topNum as varchar(20))+' order by  istop desc, addTime desc'
     50  --print @sql
     51  exec sp_executeSql  @sql
     52    end
     53  else begin  
     54  set @sql='insert into t#(id,title,userid,classid,istop) select  a.id,a.title,a.userId,a.classId,a.isTop from article a  where a.id not in(select [id] from t#) and '+@stringStr+' and isTop<'+cast@topNum as varchar(20))+'  order by addTime desc'
     55  --print @sql
     56  exec sp_executeSql  @sql
     57    End  
     58  --create temp tble end
     59 
     60 
     61 if(@selectNum<>0)  --@selectNum=0,则表示分页,不然就取selectTopNum条数据
     62         begin
     63  set @sql=' select '+@selectTopNum+' * from t#  order by tid asc'
     64  --print  @sql
     65  exec sp_executeSql @sql
     66         end 
     67  else begin
     68   --print 'begin'
     69   Set @TemSql='Select @RecordCount=Count(1) from t#'
     70         exec sp_executesql @TemSql,N'@RecordCount float output',@RecordCount output
     71 
     72        Set @RowsCount=@RecordCount
     73        Set @TotalPage= ceiling(@RecordCount/@PageSize)
     74   
     75        if(@CurrentPage>@TotalPage)
     76             Set @CurrentPage=@TotalPage
     77        if(@CurrentPage<1
     78             Set @CurrentPage=1
     79        if(@PageSize<1)
     80             Set @PageSize=1
     81        --print(@RecordCount)
     82       if(@CurrentPage=1)
     83           Begin
     84                set Rowcount @PageSize
     85   print @PageSize
     86                set @Sql='select  top '+ cast@PageSize as varchar(20)) +'*   from t# order by tid asc'
     87                --print(@Sql)
     88              exec sp_executeSql @Sql
     89           End
     90       else if(@CurrentPage=@TotalPage)
     91           begin
     92               set @afterRows=@RowsCount-(@CurrentPage-1)*@PageSize
     93               set RowCount @afterRows
     94                   set @Sql='    select top '+cast@afterRows as nvarchar(20))+'  *   from  t#  order by  tid  desc'          
     95              -- print(@Sql)
     96               exec sp_executeSql @Sql
     97           end
     98       else
     99           Begin
    100               set @nRd=@PageSize* (@CurrentPage-1)
    101              print(@nRd)
    102               set RowCount @PageSize             
    103               set @Sql='select  *  from t# where tid  not in (select top '+ cast(@nRd as nvarchar(10))+'  tid  from  t# order by tid asc) ' + ' order by  tid  desc' 
    104               exec sp_executeSql @Sql
    105               --Print(@sql)
    106 
    107         End 
    108 
    109 end
    110 drop table t#
    111 end
    112 GO
    113 
    114 

    4、总结:

      很少这么认真的写点东西,呵呵,本人太懒了,其实不是懒,是因为很多时候自己需要学习的东西太多了,这是在项目中遇到的一个问题,其中在写存储过程中也发现一些存储过程需要注意的地方,就是当你定义了一个字符串变量时,做字符串的链接时,不能直接和整型变量相接,而要转换后再链接。

    PS:文章出处http://www.cnblogs.com/jxcia_Lai,欢迎转载

  • 相关阅读:
    csp-s测试41 T2 影子
    模拟测试15 T3:rps (概率期望, 神*DP)
    考试沙币错误
    测试40
    水管局长 Lct
    测试32:chemistry
    测试35:抽卡
    模拟30,树
    考试策略&&模拟30经验总结:
    模拟测试28
  • 原文地址:https://www.cnblogs.com/jxcia_Lai/p/1771543.html
Copyright © 2020-2023  润新知