我使用光标分页并希望像这样显示我的数据:
在底部,您可以转到第 1 页到第 29 页。要计算我的页数,我必须计算所有行。每次计算所有行是否很麻烦?是否有其他解决方案,或者我无法摆脱计算所有行的做法?
我也不使用偏移量,那么如何使用光标分页来实现呢?
SELECT
wp.id,
wp.updated_wst,
u.id as user_id, u.firstname, u.lastname,
c.id as company_id, c.company,
wst.id as wst_id,
wst.start_time,
wst.end_time,
wst.send_start_at,
wst.send_end_at,
wst.accepted_by,
wst.accepted_at,
l.name as location
FROM workers_plan wp
LEFT JOIN users u
ON u.id = wp.user_id
LEFT JOIN clients c
ON c.id = u.company_id
LEFT JOIN workers_send_times wst
ON wst.workers_plan_id = wp.id
LEFT JOIN location_orders lo
ON lo.id = wp.location_orders_id
LEFT JOIN location l
ON l.id = lo.location_id
WHERE lo.id = $1 AND wp.tenant_id = $2 AND (wp.id, wp.updated_wst) > ($3, $4)
GROUP BY wp.id, wst.id, u.id, c.id, l.name
ORDER BY wp.id, wp.updated_wst LIMIT 50
这是我当前的代码。但要显示页面,我必须先计算行数,然后计算。我该怎么做(性能最佳的方法)?
如果您需要知道将有多少页,则需要知道总结果集数,而计算该数额的代价很高。此外,数据可能会发生变化,然后 29 页实际上可能会变成 28 页或 30 页,因此页数具有误导性。
我想鼓励您不要计算结果行数。网络搜索引擎不会这样做,而且他们知道原因。以下是一些建议:
只是不要显示页数。提供一种浏览下一页、前 10 页左右以及(可能)最后一页的方法。
在查询中使用
EXPLAIN (FORMAT JSON)
,然后您可以轻松地从结果中提取估计的行数。这样您就可以说“第 1 页,共约 29 页”,在大多数情况下应该足够了。如果您确实需要精确的行数,请不要立即计算。相反,提供一个“精确行数”按钮,并仅在用户坚持时计算(缓慢的)结果。
这篇文章可能会让你感兴趣。