【问题标题】:mySQL Pagination Using Limit Retrieves Duplicate Rows使用限制的 mySQL 分页检索重复的行
【发布时间】:2011-12-19 18:43:51
【问题描述】:

我有一个包含 116,000 行的表,我想检索所有这些行,但在 3 个单独的查询中使用:

  1. "SELECT * FROM table LIMIT 0, 50000"
  2. "SELECT * FROM table LIMIT 1, 50000"
  3. "SELECT * FROM table LIMIT 2, 50000"

我已经尝试过了,但是所有查询都返回了 50,000 行的结果,即使“LIMIT 是 10, 50000”也有一个不是我想要的结果。我只期望第三个查询有 16,000 行。

我怎样才能做到这一点?我对 LIMIT 分页的期望是错误的吗?

【问题讨论】:

    标签: mysql pagination limit


    【解决方案1】:

    您对 LIMIT 工作原理的期望是错误的。第一个参数是要获取的第一条记录,第二个参数是要获取的记录数。

    例如,如果查询有 800 个结果并且您使用 LIMIT 100, 300,您将获得第 100 到第 400 行,总共 300 行。

    转到http://dev.mysql.com/doc/refman/5.0/en/select.html 并搜索“LIMIT 子句”以了解有关 LIMIT 工作原理的更多信息。

    【讨论】:

      【解决方案2】:

      LIMIT 的第一个参数是起始记录号,而不是起始页码。在这种情况下,您的限制应该是:

      1. "SELECT * FROM table LIMIT 0, 50000" # 50,000 条记录,从第 0 条记录开始
      2. "SELECT * FROM table LIMIT 50000, 50000" # 50,000 条记录,从第 50000 条记录开始
      3. "SELECT * FROM table LIMIT 100000, 50000" # 50,000 条记录,从第 100000 条记录开始

      【讨论】:

        【解决方案3】:

        它是LIMIT offset, rowcount。您的第一个查询从第 0 行开始获取 50,000 行。您的第二个查询从第 2 行开始获取 50,000 行。换句话说,您要获取 49,999 行相同的行,然后再获取不同的行。

        如果您想将 116,000 行分成 3 个相等的部分,您必须这样做

        SELECT ... LIMIT 0, 38666
        SELECT ... LIMIT 38667, 38666
        SELECT ... LIMIT 77333, 38668
        

        【讨论】:

          【解决方案4】:

          Limit 子句接受一个或两个参数:

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

          所以你可以这样做:

          select * from table limit 0,50000;
          select * from table limit 50001,50000;
          select * from table limit 100001,50000;
          

          看看这个link

          【讨论】:

          • 我认为您每次都会丢失一行。它应该是 0、50000,然后是 50000、50000 等等
          【解决方案5】:

          是的,你的理解是错误的。你应该这样做

          SELECT * FROM table LIMIT 100000, 50000
          

          。语法是

          SELECT [..] LIMIT <count>
          

          SELECT [..] LIMIT <offset>, <count>
          

          。而一切都与选择的行数有关。

          【讨论】:

          • 他不希望每页有 50000 个结果。
          猜你喜欢
          • 2017-05-25
          • 1970-01-01
          • 2016-01-07
          • 2018-06-30
          • 2021-06-28
          • 2017-05-18
          • 2015-12-16
          • 2020-10-23
          • 2019-02-25
          相关资源
          最近更新 更多