作者:李义星,原创,转载请注明作者!
方法一:
表数据如图
[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
和第一种方法排序的效率比较待测试
方法一:
表数据如图
[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
和第一种方法排序的效率比较待测试