分页(mysql,其他数据可使用类似方式)

作者:李义星,原创,转载请注明作者!

方法一:

表数据如图

[img]http://dl.iteye.com/upload/attachment/435580/f0d887ef-85ae-3885-a920-ea1f78bd9ab2.jpg[/img]


假设两行是一页

取第一页直接查出(limit 2)

非第一页(假设第3页),那么先取出1-2页的数据

SELECT OP.PRODUCT_ID FROM openb2c.OPEN_PRODUCT OP
WHERE BRAND_NAME='001'
ORDER BY OP.PRODUCT_ID LIMIT 4

这个时候可以直接用NOT IN (SELECT OP.PRODUCT_ID FROM openb2c.OPEN_PRODUCT OP
WHERE BRAND_NAME='001'
ORDER BY OP.PRODUCT_ID LIMIT 4 )方式直接分页,但是这样会很慢,我们加入反排序:

SELECT OP.PRODUCT_ID FROM
(
# 取前N行记录
SELECT OP.PRODUCT_ID FROM openb2c.OPEN_PRODUCT OP
WHERE BRAND_NAME='001'
ORDER BY OP.PRODUCT_ID LIMIT 4
) OP
ORDER BY OP.PRODUCT_ID DESC
LIMIT 1

取出反排序后第一条数据,实际上对应的是图中的第四条数据

然后

大于运算(>)就可以取第四条以后的数据,并且设置了LIMIT,只取2条,效率比IN高出很多!


完整SQL:


#前N行中最大的哪行下一行开始取,读取数量为分页大小
SELECT * FROM openb2c.OPEN_PRODUCT OP
WHERE OP.PRODUCT_ID > (
#前N行记录倒叙,并且只取第一条
SELECT OP.PRODUCT_ID FROM
(
# 取前N行记录
SELECT OP.PRODUCT_ID FROM openb2c.OPEN_PRODUCT OP
WHERE BRAND_NAME='001'
ORDER BY OP.PRODUCT_ID LIMIT 57001
) OP
ORDER BY OP.PRODUCT_ID DESC
LIMIT 1
) AND
OP.BRAND_NAME = '001'
ORDER BY OP.PRODUCT_ID
LIMIT 20

然而这种方式只可在主键排序才能进行。所以介绍第二种方法


方法二:

//当有要求排序时

SELECT * FROM XXX ORDER BY XX LIMIT (页数 + 1)*页大小

然后从排序后的数据进行反排序,取出page大小的数据


SELECT * FROM(

SELECT * FROM XXX ORDER BY XX LIMIT (页数 + 1)*页大小

) order by 反排序 limit 页大小

然后在按要求排序

SELECT * FROM

SELECT * FROM(

SELECT * FROM XXX ORDER BY XX LIMIT (页数 + 1)*页大小

) order by XX (原来是升序就降序(反排序) limit pagesize数据量

) ORDER BY XX

和第一种方法排序的效率比较待测试
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值