关于客户端接口分页sql语句

今天突然翻到为客户端写分页数据的sql,发现其实逻辑不对。按照id降序

当时这样写的:

#翻上一页:
select 字段 from 表 where id>lastId order by id desc limit pageSize
#翻下一页:
select 字段 from 表 where id<lastId order by id desc limit pageSize

lastId是临近id,即上一页是最上面的id,下一页是最下面的id

pageSize是页面条数

显然,逻辑有问题。

如果pageSize=3;id列表是这样的:

 14 13 12 11 10 9 8 7 6 5 4 3 2 1

因为id降序,因此翻页是这样的:

1 第一页:14 13 12
2 第二页:11 10  9
3 第三页:8  7   6 ...

但实际上,后端接收三个参数:lastId,pageSize,direct。direct=0表示上一页,1下一页。

lastId=9,并向下一页,则id<9 降序,得8 7 6,没问题;

上一页,则id>9,如果只是降序则取出:14 13 12,显然应该是升序,即:10 11 12,然后再降序,返回给客户端:12 11 10

因此,应该这样写

1 #翻上一页:
2 select * from
3 (select 字段 from 表 where id>lastId order by id  limit pageSize) temp
4 order by id desc
5 #翻下一页:
6 select 字段 from 表 where id<lastId order by id desc limit pageSize
时间: 2024-11-05 18:48:16

关于客户端接口分页sql语句的相关文章

Oracle、DB2、SQLSERVER、Mysql、Access分页SQL语句

最近把平时在项目中常用到的数据库分页sql总结了下.大家可以贴出分页更高效的sql语句.sqlserver分页  第一种分页方法 需用到的参数:  pageSize 每页显示多少条数据  pageNumber 页数 从客户端传来  totalRecouds 表中的总记录数 select count (*) from 表名  totalPages 总页数  totalPages=totalRecouds%pageSize==0?totalRecouds/pageSize:totalRecouds/

Entity Framewrok 7beta7中不同版本sql server自动生成分页sql语句的问题

在EF中,使用linq进行分页是很方便的,假如我们有一个EMP表,结构如下: public class Emp { [Key] public Guid No { get; set; } public int Age { get; set; } [Required] [StringLength(50)] public string Name { get; set; } } 如果我们进行分页的话,一般使用Skip和Take方法,这里一行最简单的代码如下: mContext.Emp.OrderBy(e

Oracle数据库查询分页SQL语句

Oracle数据库查询分页数据SQL语句: select * from (select a.*,rownum row_num from (select * from mytable t order by t.id desc) a ) b where b.row_num between 1 and 10

Database | 分页SQL语句

使用数据库SQL语句实现分页功能. Oracle分页语句 Oracle使用ROWNUM伪列实现分页: select * from ( select "temp".*, ROWNUM "rn" from <表/查询块> "temp" where ROWNUM <= currengPage * pageSize ) where "rn" > (currentPage-1) * pageSize curren

几条常见的数据库分页 SQL 语句

SQL Server 先从想要的数据处理加上Row_number()来为数据的row加上一个RowNum作为有多少条数据,然后再用BETWEEN来分隔 with t1 as (select * ,  Row_number() OVER (ORDER BY userId DESC) AS RowNum from users) SELECT *FROM t1 WHERE RowNum BETWEEN ((page-1)*rows+1) AND (page*rows) Oralce数据库 从数据库表中

分页Sql语句

第一种 Top剔除法.去除Top (pageIndex-1)*PageSize SELECT TOP 10* FROM dbo.SBD_EXCHANGE_BILL WHERE EB_ID NOT IN (SELECT TOP (10*1) EB_ID FROM dbo.SBD_EXCHANGE_BILL ORDER BY EB_ID) 第二种 Max剔除法 .去除 小于  Max(PageIndex-1)*pageSize SELECT TOP 10 * FROM dbo.SBD_EXCHANG

分页sql语句优化

MySQL的limit工作原理就是先读取n条记录,然后抛弃前n条,读m条想要的,所以n越大,性能会越差. 一般的分页做法,测试耗时 10.961s SELECT * FROM v_history_data  LIMIT 5000000, 10 优化后,测试耗时 1.943s SELECT * FROM v_history_data INNER JOIN (SELECT fid FROM t_history_data LIMIT 5000000, 10) a USING (fid) 优化前的SQL

springmvc+mybatis 做分页sql 语句

<?xml version="1.0" encoding="UTF-8" ?><!DOCTYPE mapperPUBLIC "-//mybatis.org//DTD Mapper 3.0//EN""http://mybatis.org/dtd/mybatis-3-mapper.dtd"><mapper namespace="ssmy.dao.UserDao"> <r

sqlserver中的分页sql语句,不同于mysql中的limit,相当于top+top

方法1:适用于 SQL Server 2000/2005 SELECT TOP 页大小 *FROM table1WHERE id NOT IN ( SELECT TOP 页大小*(页数-1) id FROM table1 ORDER BY id )ORDER BY id 方法2:适用于 SQL Server 2000/2005 SELECT TOP 页大小 *FROM table1WHERE id > ( SELECT ISNULL(MAX(id),0) FROM ( SELECT TOP 页大