如何在按enabled排序时使用字符串title实现键集分页
键集分页实现:按enabled排序并以title为键获取最后3行数据
原表格数据:
| title | enabled |
|---|---|
| Four | N |
| Two | N |
| Three | N |
| One | Y |
| Five | Y |
| Six | Y |
你遇到的问题是:用where title > 'Three' order by enabled的SQL无法得到预期的最后3行,因为该语句仅过滤了字母顺序大于'Three'的title行,没有结合enabled的排序规则。
核心思路
键集分页必须结合所有排序字段构造过滤条件,否则会出现逻辑错误。这里排序主字段是enabled,次字段是title(用来保证排序唯一性,避免同enabled值下的行顺序混乱),所以过滤条件需要同时考虑这两个字段。
解决方案1:直接构造边界条件
如果已知前半部分数据的最后一个排序键(此处为enabled='N'且title='Two'),可直接用以下SQL获取最后3行:
select title, enabled from my_table where (enabled > 'N') OR (enabled = 'N' AND title > 'Two') order by enabled, title;
解决方案2:动态获取分页边界
如果不知道前半部分的边界值,可先查询出第3行的排序键,再用它作为过滤条件:
-- 第一步:获取前半部分最后一行的排序键 select enabled, title from my_table order by enabled, title limit 1 offset 2; -- offset从0开始,此处取第3行
得到结果enabled='N', title='Two'后,再执行解决方案1的SQL即可。
解决方案3:反向分页(适合不确定边界的场景)
如果想直接获取最后3行并保持原排序顺序,可先倒序取前3行,再正序排列:
select title, enabled from ( select title, enabled from my_table order by enabled desc, title desc limit 3 ) t order by enabled, title;
以上方式都能得到按enabled排序后的最后3行数据:
| title | enabled |
|---|---|
| Five | Y |
| One | Y |
| Six | Y |
内容的提问来源于stack exchange,提问作者berslucas
相关产品推荐
相关产品推荐

