【问题标题】:"Inverse" Limit?“逆”极限?
【发布时间】:2023-03-30 01:54:01
【问题描述】:

我正在使用 MySQL 来存储财务资料,并使用这些数据来构建每个帐户的所有交易记录等。出于性能原因 - 并且为了防止用户被巨大的表格所淹没 - 我对结果进行了分页。

现在,作为登记的一部分,我会显示帐户的流动余额。因此,如果我每页显示 20 笔交易,并且我正在显示第二页,我使用的数据如下:

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

最后一个让我很烦。使用 LIMIT 子句选择 first 40 个事务很容易,但是对于所有 前 40 个事务是否有可比性?像“LIMIT -40”这样的东西?

我知道我可以用 COUNT 和一点数学来做到这一点,但实际查询有点难看(多个 JOIN 和 GROUP BY),所以我宁愿尽可能少地发出它。这似乎足够有用,可以包含在 SQL 中——我只是不知道。还有人吗?

【问题讨论】:

    标签: mysql sql pagination limit


    【解决方案1】:

    你可以这样破解它:

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

    这有点像在 MySQL 中使用 Oracle 的 rownum。

    【讨论】:

      【解决方案2】:

      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;
      

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

      【讨论】:

      • 是有道理的,即使它有点像黑客。我接管了 Adrian 的,因为它看起来更有可能使用索引。所以,尽管你删除了我最初的问题中我礼貌的部分,并感谢人们帮助我:谢谢。
      • @Xavier:我只删除了多余和不必要的标签和签名。请停止在您的问题中写下它们。
      猜你喜欢
      • 2011-10-27
      • 2012-11-27
      • 2015-07-10
      • 2010-09-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多