日期:2014-05-16  浏览次数:20806 次

分页(mysql,其他数据可使用类似方式)
作者:李义星,原创,转载请注明作者!

方法一:

表数据如图




假设两行是一页

取第一页直接查出(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

和第一种方法排序的效率比较待测试