asp.net 相關(guān)文章實(shí)現(xiàn)方法第1/2頁
更新時(shí)間:2009年05月28日 21:37:37 作者:
大家或許會(huì)覺得很驚訝:為什么靈感之源會(huì)討論SQL?或許應(yīng)該這樣說吧:搞業(yè)務(wù)系統(tǒng),不跟SQL扯上關(guān)系似乎比較難。
前言:大家或許會(huì)覺得很驚訝:為什么靈感之源會(huì)討論SQL?或許應(yīng)該這樣說吧:搞業(yè)務(wù)系統(tǒng),不跟SQL扯上關(guān)系似乎比較難。
場景:在開發(fā)某系統(tǒng)的過程中,我遇到了要實(shí)現(xiàn)“相關(guān)文章”功能:任何文章都可以定義“關(guān)鍵字”,每篇文章依靠這個(gè)“關(guān)鍵字”來確定其它文章是否跟它相關(guān),如果沒有定義關(guān)鍵字,則可能需要使用全文檢索來實(shí)現(xiàn)了,這是別的話題了。
思考:因?yàn)樵试S關(guān)鍵字可以通過“,”分隔符號來定義多個(gè),所以加大了難度。經(jīng)過思考,可以通過在保存文章的時(shí)候便分解關(guān)鍵字,建立一關(guān)鍵字表,把所有關(guān)鍵字逐個(gè)按對應(yīng)的文章ID來保存。并決定采用純SQL存儲(chǔ)過程的辦法,因?yàn)檫@種重復(fù)的操作,與其用通用函數(shù),倒不如用預(yù)編譯的存儲(chǔ)過程更加快,這樣能把所有處理都留給SQL Server。
解決方案1:首選要做的是在原有文章表(Details)的基礎(chǔ)上建立相關(guān)文章表(RelatedDetails),字段包括ItemID(主鍵)、DetailID(文章ID)和Keyword(關(guān)鍵字)。以下是主要存儲(chǔ)過程:
1、UpdateRelatedDetails:更新相關(guān)文章關(guān)鍵字
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:刪除原有相關(guān)文章關(guān)鍵字
CREATE PROCEDURE dbo.DeleteRelatedDetails
@DetailID INT
AS
DELETE FROM DetailKeywords WHERE DetailID=@DetailID
GO
3、GetRelatedDetails:獲取相關(guān)文章,其中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
場景:在開發(fā)某系統(tǒng)的過程中,我遇到了要實(shí)現(xiàn)“相關(guān)文章”功能:任何文章都可以定義“關(guān)鍵字”,每篇文章依靠這個(gè)“關(guān)鍵字”來確定其它文章是否跟它相關(guān),如果沒有定義關(guān)鍵字,則可能需要使用全文檢索來實(shí)現(xiàn)了,這是別的話題了。
思考:因?yàn)樵试S關(guān)鍵字可以通過“,”分隔符號來定義多個(gè),所以加大了難度。經(jīng)過思考,可以通過在保存文章的時(shí)候便分解關(guān)鍵字,建立一關(guān)鍵字表,把所有關(guān)鍵字逐個(gè)按對應(yīng)的文章ID來保存。并決定采用純SQL存儲(chǔ)過程的辦法,因?yàn)檫@種重復(fù)的操作,與其用通用函數(shù),倒不如用預(yù)編譯的存儲(chǔ)過程更加快,這樣能把所有處理都留給SQL Server。
解決方案1:首選要做的是在原有文章表(Details)的基礎(chǔ)上建立相關(guān)文章表(RelatedDetails),字段包括ItemID(主鍵)、DetailID(文章ID)和Keyword(關(guān)鍵字)。以下是主要存儲(chǔ)過程:
1、UpdateRelatedDetails:更新相關(guān)文章關(guān)鍵字
復(fù)制代碼 代碼如下:
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:刪除原有相關(guān)文章關(guān)鍵字
復(fù)制代碼 代碼如下:
CREATE PROCEDURE dbo.DeleteRelatedDetails
@DetailID INT
AS
DELETE FROM DetailKeywords WHERE DetailID=@DetailID
GO
3、GetRelatedDetails:獲取相關(guān)文章,其中Details就是文章表
復(fù)制代碼 代碼如下:
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
相關(guān)文章
未在本地計(jì)算機(jī)上注冊“microsoft.ACE.oledb.12.0”提供程序報(bào)錯(cuò)的解決辦法
這篇文章主要給大家介紹了關(guān)于未在本地計(jì)算機(jī)上注冊“microsoft.ACE.oledb.12.0”提供程序報(bào)錯(cuò)的完美解決辦法,需要的朋友可以參考下2019-03-03asp.net使用JS+form表單Post和Get方式提交數(shù)據(jù)
今天小編就為大家分享一篇關(guān)于asp.net使用JS+form表單Post和Get方式提交數(shù)據(jù),小編覺得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來看看吧2019-01-01IIS故障(Connections_Refused)問題分析及處理
這幾天某地市Web服務(wù)器連續(xù)多次出現(xiàn)故障問題(Connections_Refused),正好借這個(gè)案例向大家詳細(xì)介紹下,需要了解的朋友可以參考下2012-12-12頁面間隔半秒鐘更新時(shí)間 Asp.net使用Comet開發(fā)http長連接示例分享
Comet(Reverse AJAX)主要是通過HTTP長連接, 保持和服務(wù)器的連接,實(shí)現(xiàn)Server PUSH 和雙向通信,下面通過示例學(xué)習(xí)他的使用方法2014-01-01