2012-11-29 83 views
2

我想從sql語句創建記錄的分頁,我能夠獲得所有的下一個和上一個,但最後一個記錄顯示上一個記錄爲下一個由於sql查詢只返回1行而不是2.我將下一個基於第一個結果和前一個作爲第二個結果。如何通過sql來選擇第一個,最後一個以及上一個和下一個通過

數據:

  • 蘋果
  • 香蕉
  • 葡萄
  • 橙色

的SQL:

select * 
from (select top 1 fruit 
     FROM table 
     where fruit > 'Banana' 
     order by fruit asc) as x 

UNION ALL 

select * 
from (select top 1 fruit 
     FROM table 
     where fruit < 'Banana' order by fruit desc) as y 

將R特效:

fruit 
-------- 
Grape 
Apple 

這很好用!

對於第一個記錄 - 我得到正確的結果是第一個記錄是真正的下一個。 對於最後一條記錄 - 我得到一個結果,它是獲取上一條記錄的第二條查詢。但是我無法知道它的最後一條記錄,所以它輸出爲Next而不是Previous。

我將如何確定這是最後一條記錄,並且返回的單個行實際上是以前的記錄?

如何讓查詢返回NULL行作爲Next查詢?所以我可以測試一個NULL結果?

獎勵分!

我怎樣纔能有一個查詢,會給我第一個記錄,最後一個記錄和下一個和上一個,所以我可以啓用循環分頁?如果在第一條記錄上顯示前一條記錄。如果最後一條記錄顯示下一條記錄爲第一條記錄?

+0

如果你w螞蟻有「第一」,「最後」,「下一個」等,你需要一些列來**按**排序,例如一個*序列號*或其他東西 - 然後你需要在你的select語句中指定'ORDER BY'子句。沒有'ORDER BY' - >沒有任何類型的排序,並且您無法定義* next *或* previous *而無需排序。 –

+0

下一個應該*(因爲你有)*是'在哪裏水果>'香蕉'ORDER BY水果ASC'。但是你的先前的定義應該是'WHERE fruit <'banana'ORDER BY果實DESC'。 *(用'>'改成'<'。或者,這是一個錯誤的問題?)*另外,要獲得NULL,嘗試使用MAX(水果)和MIN(水果),而不是使用'TOP 1'和'ORDER BY'。 – MatBailie

+0

我修正了錯字@Dems我會嘗試MAX/MIN。 –

回答

3
SELECT 
    * 
FROM 
(
    SELECT 
    MIN(fruit) as first, 
    MAX(fruit) as previous 
    FROM 
    yourTable 
    WHERE 
    fruit < 'banana' 
) 
CROSS JOIN 
(
    SELECT 
    MIN(fruit) as next, 
    MAX(fruit) as last 
    FROM 
    yourTable 
    WHERE 
    fruit > 'banana' 
) 

或者更短,但我不知道,這將是更好的性能...

SELECT 
    MIN(CASE WHEN fruit < 'banana' THEN fruit END) as first, 
    MAX(CASE WHEN fruit < 'banana' THEN fruit END) as previous, 
    MIN(CASE WHEN fruit > 'banana' THEN fruit END) as next, 
    MAX(CASE WHEN fruit > 'banana' THEN fruit END) as last 
FROM 
    yourTable 

或者,作爲最後的選擇奇怪...

SELECT 
    (SELECT TOP 1 fruit FROM yourTable WHERE fruit < 'banana' ORDER by fruit ASC) AS first, 
    (SELECT TOP 1 fruit FROM yourTable WHERE fruit < 'banana' ORDER by fruit DESC) AS previous, 
    (SELECT TOP 1 fruit FROM yourTable WHERE fruit > 'banana' ORDER by fruit ASC) AS next, 
    (SELECT TOP 1 fruit FROM yourTable WHERE fruit > 'banana' ORDER by fruit DESC) AS last 

(這可能是有用的,如果你有成千上萬的記錄,因爲每個都是快速分開搜索)。

+0

謝謝!我很欣賞這個指導。 –

相關問題