使用 WHERE 和 HAVING 的键集分页
Keyset pagination with WHERE & HAVING
我 运行 遇到一个问题,我还没有找到键集分页的解决方案:
假设我们有这个查询:
SELECT a.id, a.number, AVG(b.rating) AS rating
FROM a LEFT JOIN b ON xxxxxxx
GROUP BY a.id
ORDER BY rating DESC, a.number DESC
LIMIT xxxx
我们应该如何对其进行键集分页?
仅对于a.number,我们可以有
WHERE a.number < ?;
仅针对评级,我们 HAVING rating < ?;
如果 where 有两个条件,我们可以有 WHERE (x, y) < (?, ?)
.
但是如何同时执行 HAVING 和 WHERE?
编辑:
我今天实现了这个,发现它比 OFFSET 分页慢,所以不推荐。
你永远不能使用的地方,因为它无法访问评级。
你能做的是
HAVING (x, y) < (1, 1)
SELECT a.id, a.number, AVG(b.rating) AS rating
FROM a LEFT JOIN b ON a.id = b.id
GROUP BY a.id, a.number
HAVING (a.number, rating) < (1, 1)
ORDER BY rating DESC, a.number DESC
LIMIT xxxx
我 运行 遇到一个问题,我还没有找到键集分页的解决方案:
假设我们有这个查询:
SELECT a.id, a.number, AVG(b.rating) AS rating
FROM a LEFT JOIN b ON xxxxxxx
GROUP BY a.id
ORDER BY rating DESC, a.number DESC
LIMIT xxxx
我们应该如何对其进行键集分页?
仅对于a.number,我们可以有
WHERE a.number < ?;
仅针对评级,我们 HAVING rating < ?;
如果 where 有两个条件,我们可以有 WHERE (x, y) < (?, ?)
.
但是如何同时执行 HAVING 和 WHERE?
编辑: 我今天实现了这个,发现它比 OFFSET 分页慢,所以不推荐。
你永远不能使用的地方,因为它无法访问评级。
你能做的是
HAVING (x, y) < (1, 1)
SELECT a.id, a.number, AVG(b.rating) AS rating
FROM a LEFT JOIN b ON a.id = b.id
GROUP BY a.id, a.number
HAVING (a.number, rating) < (1, 1)
ORDER BY rating DESC, a.number DESC
LIMIT xxxx