經典sql-獲取當前文章的上一篇和下一篇


  我們在做資訊類的網站的時候,肯定會有這么一個需求,就是在資訊內容頁的下方需要給出上一篇和下一篇資訊的鏈接。上次我一同事兼好友兼室友就遇到了這么一個需求,一開始我們都把問題想復雜了,先取的是符合條件的資訊信息集合,然后再找到當前這條資訊信息在集合中的索引,通過索引再找到他的上一篇資訊和下一篇資訊信息,這種做法確實是可以實現這個需求,但是一旦資訊信息的數量過大,很有可能因為這段代碼導致整個資訊內容頁半天都打不開,所以,必須得另辟蹊徑。

  其實這個問題很簡單,后來經過我們主管給我們稍微一指點,瞬間覺得高大尚啊,自己咋就沒想到呢?還是太年輕啊!實現原理就是通過當前資訊信息的Id去數據庫查找出符合排序規則的上一條和下一條資訊信息,是不是超級簡單?直接看代碼吧!

  當前資訊內容頁的Id為62,專業類別Id為20.

select top 1 -1 as [Mark],[ID],[Title] from [ZiXun_Info] where [SubjectID]=20 and [ID]<62
union 
select top 1  1 as [Mark],[ID],[Title] from [ZiXun_Info] where [SubjectID]=20 and [ID]>62

  好了,給大家看看效果.

  有Bug的效果圖,上一篇的數據不對.

  然后查詢前8條看看.

select top 8 * from [ZiXun_Info] where [SubjectID]=20 

  查詢結果:

  資訊前8條,注意添加紅色標記的部分.

  額,好像不對啊!當前資訊內容頁的Id為62,他的上一篇應該是ID等於61的那條信息才對啊!為什么是第一條呢?對了,sql默認是按ID升序排序的,所以ID小於62的第一條肯定就是55了,還得加上排序方式才行,上一篇應該按ID降序排序,下一篇默認按ID升序排序(小降大升)就行。

  加了排序方式后的sql:

select top 1 -1 as [Sort],[ID],[Title] from (select top 1 [ID],[Title] from [ZiXun_Info] where [SubjectID]=20 and [ID]<62 order by [ID] desc) as tab_up  --上一篇按ID降序排列.
union
select top 1  1 as [Sort],[ID],[Title] from [ZiXun_Info] where [SubjectID]=20 and [ID]>62  --下一篇默認按ID升序排列即可.

  執行結果圖:

  正確的上一篇和下一篇.

  好了,經過一番波折之后,我們最終還是修成了正果,這里你可以把[Mark]換成一個你內容頁用不到的字段來代替,這里我就用了[Sort]來代替,這樣就不用更改業務Model了。

  小結:不要把簡單的問題復雜化,要學會把復雜的問題簡單化,曉菜鳥,Fighting!  


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM