我正在尝试从数据库访问分页结果。按照以下查询:
alert('Hello World')
来自here,我能够实现分页。
我修改了下面的查询,以便获得总计数:
SELECT * FROM
(
SELECT a.*, rownum r__
FROM
(
SELECT * FROM ORDERS WHERE CustomerID LIKE 'A%'
ORDER BY OrderDate DESC, ShippingDate DESC
) a
WHERE rownum < ((pageNumber * pageSize) + 1 )
)
WHERE r__ >= (((pageNumber-1) * pageSize) + 1)
但我也想计算总页数,以及所请求的页面是否也是最后一页。我试图获取内部查询的SELECT * FROM
(
SELECT a.*, rownum r__ , count(OrderDate)
FROM
(
SELECT * FROM ORDERS WHERE CustomerID LIKE 'A%'
ORDER BY OrderDate DESC, ShippingDate DESC
) a group by OrderDate
)
WHERE r__ between (pageNumber * pageSize )+ 1 and (pageNumber *pageSize) + pageSize;
,以便我可以计算代码中的总页数,但我无法得到它。我试过COUNT
并进行分组,但它不起作用。
请告诉我如何实现这一目标。
答案 0 :(得分:3)
我会使用分析函数来完成您正在尝试的工作,例如:
SELECT res.*,
CEIL(total_num_rows/pagesize) total_num_pages
FROM (SELECT o.*,
row_number() OVER (ORDER BY orderdate DESC, shippingdate DESC) rn,
COUNT(*) OVER () total_num_rows
FROM orders o
WHERE customerid LIKE 'A%') res
WHERE rn BETWEEN (pagenumber - 1) * pagesize + 1 AND pagenumber * pagesize;
N.B。未经测试。
查询通过使用row_number()分析函数为每行,跨指定组和指定顺序分配编号来执行分页。由于我们在OVER部分中没有分区by子句,因此该函数在整个行集中都有效。
类似地,我们使用count()分析函数来获取指定组中的行数 - 同样,由于我们还没有指定任何partition by子句,因此该函数适用于整个行集
现在你有了这些数字,进行分页并查找总页数是一件简单的事情。
答案 1 :(得分:2)
如果您使用的是Oracle 12.1或更高版本,则会变得更简单:
select o.*
, 'Page ' || pagenumber || ' of ' || ceil(count(*) over () / pagesize) as pagecount
from orders o
where customerid like 'T%'
order by orderdate desc, shippingdate desc
offset (pagenumber -1) * pagesize rows fetch next pagesize rows only;
page count
列会报告Page 2 of 34
等值。