2012-11-29 41 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

谢谢!我很欣赏这个指导。 –

相关问题