Cấp bậc tác giả:

DATABASE

Hướng dẫn xây dựng website: Viết store procedure phần 6

Được viết bởi QuangIT ngày 13/08/2012 lúc 07:32 PM
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.
  • 0
  • 8634

Hướng dẫn xây dựng website: Viết store procedure phần 6

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 1
Xây dựng cơ sở dữ liệu - TRIGGER
Viết store procedure phần 1
Viết store procedure phần 2
Viết store procedure phần 3
Viết store procedure phần 4
Viết store procedure phần 5

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

 Chúc bạn thành công!

Nguồn bài viết: hmweb

BÌNH LUẬN BÀI VIẾT

Bài viết mới nhất

LIKE BOX

Bài viết được xem nhiều nhất

HỌC HTML