asp.net 相关文章实现方法第1/2页
程序员文章站
2022-07-04 17:20:35
前言:大家或许会觉得很惊讶:为什么灵感之源会讨论sql?或许应该这样说吧:搞业务系统,不跟sql扯上关系似乎比较难。 场景:在开发某系统的过程中,我遇到了要实现“相关文章”...
前言:大家或许会觉得很惊讶:为什么灵感之源会讨论sql?或许应该这样说吧:搞业务系统,不跟sql扯上关系似乎比较难。
场景:在开发某系统的过程中,我遇到了要实现“相关文章”功能:任何文章都可以定义“关键字”,每篇文章依靠这个“关键字”来确定其它文章是否跟它相关,如果没有定义关键字,则可能需要使用全文检索来实现了,这是别的话题了。
思考:因为允许关键字可以通过“,”分隔符号来定义多个,所以加大了难度。经过思考,可以通过在保存文章的时候便分解关键字,建立一关键字表,把所有关键字逐个按对应的文章id来保存。并决定采用纯sql存储过程的办法,因为这种重复的操作,与其用通用函数,倒不如用预编译的存储过程更加快,这样能把所有处理都留給sql server。
解决方案1:首选要做的是在原有文章表(details)的基础上建立相关文章表(relateddetails),字段包括itemid(主键)、detailid(文章id)和keyword(关键字)。以下是主要存储过程:
1、updaterelateddetails:更新相关文章关键字
create procedure dbo.updaterelateddetails
@detailid int,
@keywords nvarchar(500)
as
exec deleterelateddetails @detailid
declare @i int
declare @keyword nvarchar(50)
set @keywords=replace(@keywords,',', ',')
set @keywords=replace(@keywords,';', ',')
set @keywords=rtrim(ltrim(@keywords))
set @i=charindex(',', @keywords)
while @i>=1
begin
set @keyword=left(@keywords, @i-1)
insert into detailkeywords (detailid, keyword) values(@detailid, @keyword)
set @keywords=substring(@keywords, @i+1,len(@keywords)-@i)
set @i=charindex(',', @keywords)
end
if @keywords<>''
insert into detailkeywords (detailid, keyword) values(@detailid, @keywords)
go
2、deleterelateddetails:删除原有相关文章关键字
create procedure dbo.deleterelateddetails
@detailid int
as
delete from detailkeywords where detailid=@detailid
go
3、getrelateddetails:获取相关文章,其中details就是文章表
create procedure dbo.getrelateddetails
@detailid int
as
declare @keywords nvarchar(500)
select @keywords=keywords from details where itemid=@detailid
if @keywords<>''
begin
select distinct d.itemid, d.subject, d.itemfile
from details d right outer join detailkeywords k on k.detailid=d.itemid where d.itemid <> @detailid and @keywords like '%'+k.keyword+'%'
end
go
场景:在开发某系统的过程中,我遇到了要实现“相关文章”功能:任何文章都可以定义“关键字”,每篇文章依靠这个“关键字”来确定其它文章是否跟它相关,如果没有定义关键字,则可能需要使用全文检索来实现了,这是别的话题了。
思考:因为允许关键字可以通过“,”分隔符号来定义多个,所以加大了难度。经过思考,可以通过在保存文章的时候便分解关键字,建立一关键字表,把所有关键字逐个按对应的文章id来保存。并决定采用纯sql存储过程的办法,因为这种重复的操作,与其用通用函数,倒不如用预编译的存储过程更加快,这样能把所有处理都留給sql server。
解决方案1:首选要做的是在原有文章表(details)的基础上建立相关文章表(relateddetails),字段包括itemid(主键)、detailid(文章id)和keyword(关键字)。以下是主要存储过程:
1、updaterelateddetails:更新相关文章关键字
复制代码 代码如下:
create procedure dbo.updaterelateddetails
@detailid int,
@keywords nvarchar(500)
as
exec deleterelateddetails @detailid
declare @i int
declare @keyword nvarchar(50)
set @keywords=replace(@keywords,',', ',')
set @keywords=replace(@keywords,';', ',')
set @keywords=rtrim(ltrim(@keywords))
set @i=charindex(',', @keywords)
while @i>=1
begin
set @keyword=left(@keywords, @i-1)
insert into detailkeywords (detailid, keyword) values(@detailid, @keyword)
set @keywords=substring(@keywords, @i+1,len(@keywords)-@i)
set @i=charindex(',', @keywords)
end
if @keywords<>''
insert into detailkeywords (detailid, keyword) values(@detailid, @keywords)
go
2、deleterelateddetails:删除原有相关文章关键字
复制代码 代码如下:
create procedure dbo.deleterelateddetails
@detailid int
as
delete from detailkeywords where detailid=@detailid
go
3、getrelateddetails:获取相关文章,其中details就是文章表
复制代码 代码如下:
create procedure dbo.getrelateddetails
@detailid int
as
declare @keywords nvarchar(500)
select @keywords=keywords from details where itemid=@detailid
if @keywords<>''
begin
select distinct d.itemid, d.subject, d.itemfile
from details d right outer join detailkeywords k on k.detailid=d.itemid where d.itemid <> @detailid and @keywords like '%'+k.keyword+'%'
end
go
1
上一篇: Discuz .net版本中的短消息系统第1/2页
下一篇: .net 反序题目的详细解答第1/2页
推荐阅读
-
asp.net下gridview 批量删除的实现方法第1/3页
-
asp.net下用url重写URLReWriter实现任意二级域名的方法第1/2页
-
asp.net access添加返回自递增id的实现方法第1/3页
-
asp.net下用url重写URLReWriter实现任意二级域名的方法第1/2页
-
asp.net 相关文章实现方法第1/2页
-
asp.net下用url重写URLReWriter实现任意二级域名的方法第1/2页
-
asp.net下gridview 批量删除的实现方法第1/3页
-
asp.net access添加返回自递增id的实现方法第1/3页
-
asp.net 相关文章实现方法第1/2页