我們在做資訊類的網站的時候,肯定會有這么一個需求,就是在資訊內容頁的下方需要給出上一篇和下一篇資訊的鏈接。上次我一同事兼好友兼室友就遇到了這么一個需求,一開始我們都把問題想復雜了,先取的是符合條件的資訊信息集合,然后再找到當前這條資訊信息在集合中的索引,通過索引再找到他的上一篇資訊和下一篇資訊信息,這種做法確實是可以實現這個需求,但是一旦資訊信息的數量過大,很有可能因為這段代碼導致整個資訊內容頁半天都打不開,所以,必須得另辟蹊徑。
其實這個問題很簡單,后來經過我們主管給我們稍微一指點,瞬間覺得高大尚啊,自己咋就沒想到呢?還是太年輕啊!實現原理就是通過當前資訊信息的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
好了,給大家看看效果.
然后查詢前8條看看.
select top 8 * from [ZiXun_Info] where [SubjectID]=20
查詢結果:
額,好像不對啊!當前資訊內容頁的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!