Xây dựng cơ sở dữ liệu cho một website phần 8

Loại: Viết store procedure phần 5

Các bài cần theo dõi của bài viết: Xây dựng cơ sở dữ liệu cho một website

Phần 1: Tạo database

Phần 2: Viết Trigger

Phần 3: Viết store procedure truy vấn, thêm, sửa, xóa một chuyên mục

Phần 4: Viết store procedure hiển thị menu đa cấp

Phần 5: Viết store Procedure thêm, sửa, xóa một bài viết

Phần 6: Viết store procedure hiển thị danh sách bài viết

Phần 7: Viết store procedure tìm kiếm bài viết

Phần 8: Viết store procedure top 10 các bài viết mới và cũ

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.

Thườ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>' as Title    

      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

- 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>' as Title

      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(@idNews AS 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 AS nvarchar(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,5
Kết quả hiển thị như minh họa sau