“逆”限制?

发布于 2024-12-06 17:22:58 字数 554 浏览 1 评论 0原文

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

现在,作为登记的一部分,我显示该帐户的运行余额。因此,如果我每页显示 20 笔交易,并且显示第二页,我将按如下方式使用数据:

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

令我烦恼的是最后一个。使用 LIMIT 子句很容易选择 40 个事务,但是除前 40 个之外的所有事务是否都具有可比性?像“LIMIT -40”之类的东西?

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

I'm using MySQL to store financial stuff, and using the data to build, among other things, registers of all the transactions for each account. For performance reasons - and to keep the user from being overwhelmed by a gargantuan table - I paginate the results.

Now, as part of the register, I display a running balance for the account. So if I'm displaying 20 transactions per page, and I'm displaying the second page, I use the data as follows:

  • Transactions 0 - 19: Ignore them - they're more recent than the page being looked at.
  • Transactions 20 - 39: Select everything from these - they'll be displayed.
  • Transactions 40 - ??: Sum the amounts from these so the running balance is accurate.

It's that last one that's annoying me. It's easy to select the first 40 transactions using a LIMIT clause, but is there something comparable for everything but the first 40? Something like "LIMIT -40"?

I know I can do this with a COUNT and a little math, but the actual query is a bit ugly (multiple JOINs and GROUP BYs), so I'd rather issue it as few times as possible. And this seems useful enough to be included in SQL - and I just don't know about it. Does anybody else?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

吃不饱 2024-12-13 17:22:58

文档说:

LIMIT 子句可用于限制返回的行数
通过 SELECT 语句。 LIMIT 接受一个或两个数字参数,
它们必须都是非负整数常量,其中
例外:

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

  • 在存储的程序中,可以使用以下方式指定LIMIT参数
    MySQL 中的整数值例程参数或局部变量
    5.5.6.

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

从 tbl LIMIT 5,10 中选择*; # 检索第 6-15 行

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

SELECT * FROM tbl LIMIT 95,18446744073709551615;

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

The documentation says:

The LIMIT clause can be used to constrain the number of rows returned
by the SELECT statement. LIMIT takes one or two numeric arguments,
which must both be nonnegative integer constants, with these
exceptions:

  • Within prepared statements, LIMIT parameters can be specified
    using ? placeholder markers.

  • Within stored programs, LIMIT parameters can be specified using
    integer-valued routine parameters or local variables as of MySQL
    5.5.6.

With two arguments, the first argument specifies the offset of the
first row to return, and the second specifies the maximum number of
rows to return. The offset of the initial row is 0 (not 1):

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

To retrieve all rows from a certain offset up to the end of the result
set, you can use some large number for the second parameter. This
statement retrieves all rows from the 96th row to the last:

SELECT * FROM tbl LIMIT 95,18446744073709551615;

Next time, please use the documentation as your first port of call.

薄情伤 2024-12-13 17:22:58

你可以这样破解它:

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

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

You can hack it this way:

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

It's kinda like having Oracle's rownum in MySQL.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文