“反向”限制?

时间:2011-09-26 16:35:20

标签: mysql sql pagination limit

我正在使用MySQL来存储财务资源,并使用这些数据来构建每个帐户的所有交易的寄存器。出于性能原因 - 并防止用户被庞大的桌子淹没 - 我对结果进行了分页。

现在,作为注册表的一部分,我会显示该帐户的运行余额。因此,如果我每页显示20个事务,并且我正在显示第二个页面,则使用如下数据:

  • 交易0 - 19:忽略它们 - 它们比正在查看的页面更新。
  • 交易20 - 39:从这些中选择所有内容 - 它们将被显示。
  • 交易40 - ??:将这些金额相加,以便运行余额准确无误。

这是最后一个令我烦恼的事。使用LIMIT子句可以很容易地选择第一个 40个事务,但是对于但是的前40个事件是否有类似的东西?像“LIMIT -40”这样的东西?

我知道我可以使用COUNT和一些小数学来做这个,但实际的查询有点难看(多个JOIN和GROUP BY),所以我宁愿尽可能多地发出它。这看起来很有用,可以包含在SQL中 - 我只是不知道它。还有其他人吗?

2 个答案:

答案 0 :(得分:5)

The documentation说:

  

LIMIT子句可用于约束返回的行数   通过SELECT声明。 LIMIT需要一个或两个数字参数,   这些必须都是非负整数常数   例外:

     
      
  • 在预准备语句中,可以指定LIMIT个参数   用?占位符标记。

  •   
  • 在存储的程序中,可以使用指定LIMIT个参数   从MySQL开始的整数值例程参数或局部变量   5.5.6。

  •   
     

使用两个参数,第一个参数指定的偏移量   第一行返回,第二行指定最大数量   要返回的行。初始行的偏移量为0(不是1):

SELECT * FROM tbl LIMIT 5,10;  # Retrieve rows 6-15
     

从特定偏移量检索所有行直到结果的末尾   设置,您可以使用一些大数字作为第二个参数。这个   语句检索从第96行到最后一行的所有行:

SELECT * FROM tbl LIMIT 95,18446744073709551615;

下次,请使用该文档作为您的第一个停靠点。

答案 1 :(得分:1)

你可以这样破解:

select sel.*
from
(
SELECT @rownum:=@rownum+1 rownum, t.*
FROM (SELECT @rownum:=0) r, YourTableOrYourSubSelect t
) sel
where rownum > 40

有点像在MySQL中拥有Oracle的rownum。