Bài này mình sẽ hướng dẫn truy vấn danh sách các bài viết khác bao gôm 10 bài viết mới hơn và 10 bài viết cũ hơn gần nhất (Nếu có), cùng chuyên mục của bài viết được chọn.
Xây dựng cơ sở dữ liệu phần 1Xây dựng cơ sở dữ liệu - TRIGGERViết store procedure phần 1Viết store procedure phần 2Viết store procedure phần 3Viết store procedure phần 4Viết store procedure phần 5Thường khi làm web khi người dùng chọn đọc một bài viết, bạn cần liệt kê cho người dùng danh sách các bài viết khác cùng chuyên mục. Thường đề làm điều này bạn sẽ dùng code lập trình hoặc sẽ phải viết nhiều store hoặc dùng vòng lặp đề thực hiện. Nhưng ở đây mình sẽ viết để thực hiện trong cơ sở dữ liệu.
Để làm được trước tiên bạn cần viết 2 hàm.- Hàm trả về 10 bài viết mới hơn cùng chuyên mục, gần nhất với bài viết được chọn
-- =============================================
-- Author: webmaster@hmweb.com.vn-- Description: <Hàm trà về 10 bài viết mới hơn, cùng chuyên mục, gần nhất với bài viết được chọn>
-- =============================================
CREATE FUNCTION [dbo].[fuNewOfNews]
(
@idNews int,
@CateID int
)RETURNS @TB_News_New TABLE
(
idNews int,
Title nvarchar(2000)
)
AS
BEGIN
INSERT INTO @TB_News_New
SELECT TOP 10 TB_News.idNews,
'<A href='+ dbo.ufDomainName()+TB_News.Link +' >'+TB_News.Title+'</a>' asTitle
FROM TB_News INNER JOIN
TB_Category ON TB_News.CateID = TB_Category.CateID
WHERE TB_News.idNews>@idNews AND TB_News.CateID=@CateID ANDTB_News.Status=1
ORDER BY TB_News.idNews DESC
RETURN
END
- Hàm trả về 10 bài viết cũ hơn cùng chuyên mục, gần nhất với bài viết được chọn
-- =============================================
-- Author: webmaster@hmweb.com.vn
-- Description: <Hàm trà về 10 bài viết cũ hơn, cùng chuyên mục, gần nhất với bài viết được chọn>
-- =============================================
CREATE FUNCTION [dbo].[fuOldOfNews]
(
@idNews int,
@CateID int
)
RETURNS @News_Old TABLE
(
idNews int,
Title nvarchar(2000)
)
AS
BEGIN
INSERT INTO @News_Old
SELECT TOP 10 TB_News.idNews,
'<A href='+ dbo.ufDomainName()+TB_News.Link +' >'+TB_News.Title+'</a>' asTitle
FROM TB_News INNER JOIN
TB_Category ON TB_News.CateID = TB_Category.CateID
WHERE TB_News.idNews<@idNews
AND TB_News.CateID=@CateID AND TB_News.Status=1
ORDER BY TB_News.idNews DESC
RETURN
END
Tiếp theo mình sẽ viết Store procedure đề lấy danh sách 10 bài viết mới hơn và 10 bài viết cũ hơn gần nhất (Nếu có)-- =============================================
-- Author: webmaster@hmweb.com.vn
-- Description: <truy vấn danh sách các bài viết khác cùng chuyên mục>
-- =============================================
CREATE PROCEDURE [dbo].[spTB_News_SelectCacBaiVietKhac]
@idNews int,
@CateID int
AS
BEGIN
DECLARE @SQL nvarchar(4000)
SET @SQL=''
-- Kiểm tra có bài viết mới hơn không
DECLARE @countNew int
SELECT @countNew = count(idNews) FROM TB_News
WHERE TB_News.idNews>@idNews AND CateID=@CateID AND Status=1
IF @countNew IS NULL SET @countNew=0
-- Kiểm tra có bài viết cũ hơn không
DECLARE @countOld int
SELECT @countOld = COUNT(idNews) FROM TB_News
WHERE idNews<@idNews AND CateID=@CateID AND Status=1
IF @countOld IS NULL SET @countOld=0
--Nếu có bài viết mới hơn
IF @countNew>0
BEGIN
-- Nếu có bài viết cũ hơn thì truy vấn 10 bài mới và 10 bài viết gần nhất
IF @countOld >0
BEGIN
SET @SQL=@SQL+ N'SELECT 999999999999 AS idNews,
N''<b>[Các bài viết mới hơn]</b>'' AS Title
Union
SELECT TOP 10 TB_News.idNews,
''<A href=''+ dbo.ufDomainName()+TB_News.Link +''>''+TB_News.Title+''</a>'' as Title FROM TB_News
INNER JOIN TB_Category ON TB_News.CateID = TB_Category.CateID
WHERE TB_News.Status=1 AND TB_News.idNews>'+cast(@idNewsAS nvarchar(20))+' AND
TB_News.CateID='+cast(@CateID AS nvarchar(20))+'
'
SET @SQL =@SQL+'
Union SELECT '+cast(@idNews AS nvarchar(20))+' AS idNews,
N''<b>[Các bài đã đăng]</b>'' AS Title
Union
Select idNews, Title from [dbo].[fuOldOfNews]('+Cast(@idNews AS nvarchar(20))+','+Cast(@CateID AS nvarchar(20))+')
ORDER BY TB_News.idNews DESC'
END
-- Ngược lại chỉ truy vấn 10 bài viết mới hơn gần nhất
ELSE
BEGIN
SET @SQL =@SQL+N'SELECT 999999999999 AS idNews, N''<b>[Các bài mới hơn]</b>'' AS Title
UNION
Select idNews, Title from [dbo].[fuNewOfNews]('+Cast(@idNews AS nvarchar(20))+','+Cast(@CateID AS nvarchar(20))+')
ORDER BY idNews DESC'
END
END
-- Nếu không có bài viết mới hơn => truy vấn 10 bài viết cũ hơn gần nhất
ELSE
BEGIN
SET @SQL =@SQL+N'SELECT 999999999999 AS idNews, N''<b>[Các bài đã đăng]</b>'' AS Title
UNION
Select idNews, Title from [dbo].[fuOldOfNews]('+Cast(@idNews ASnvarchar(20))+','+Cast(@CateID AS nvarchar(20))+')
ORDER BY idNews DESC'
END
--PRINT @SQL
-- Thực thi trà về danh sách bài viết
EXEC (@SQL)
END
Ví dụ khi bạn đọc bài viết thứ 13 có id=17 và CateID=5 EXEC [spTB_News_SelectCacBaiVietKhac] 17,5Kết quả hiển thị như minh họa sau
Chúc bạn thành công!