【问题标题】:get total for limit in mysql using same query?使用相同的查询获取mysql中的限制总数?
【发布时间】:2011-03-11 23:11:25
【问题描述】:

我正在制作一种分页方法,我所做的是: 第一个查询将计算所有结果,第二个查询将使用 LIMIT 进行正常选择

技术上是否有任何方法可以做到这一点,但只有一个查询?

我现在拥有的:

SELECT count(*) from table
SELECT * FROM table LIMIT 0,10

【问题讨论】:

    标签: mysql limit


    【解决方案1】:

    没有人真正提到这一点,但是使用SQL_CALC_FOUND_ROWS 技术的正确方法是这样的:

    1. 执行您的查询:SELECT SQL_CALC_FOUND_ROWS * FROM `table` LIMIT 0, 10
    2. 然后直接运行此查询:SELECT FOUND_ROWS()。此查询的结果包含上一个查询的完整计数,即好像您没有使用 LIMIT 子句一样。第二个查询很快,因为结果已经被缓存了。

    【讨论】:

      【解决方案2】:

      您可以使用子查询来做到这一点:

      select 
          *,
          (select count(*) from mytable) as total
      from mytable LIMIT 0,10
      

      但我不认为这有任何优势。

      edit:就像 Ilya 所说,总计数和行具有完全不同的含义,想要在同一个查询中检索这些数据没有真正意义。我会坚持这两个查询。我给出这个答案只是为了表明这是可能的,而不是一个好主意。

      【讨论】:

      • 这会多次返回count(*)的结果,写这样的查询是没有意义的。可悲的是,我认识一些程序员,他们会在不眨眼的情况下这样做。
      • 这就是我说做这样的事情没有优势的原因。但是,如果有某种要求在一个查询中完成所有操作,为什么不呢,这不会对性能造成那么严重的影响。
      • @Krtek 你不是在那里做 1 个查询,而是 2 个。子查询或普通查询在这里是一样的。那么为什么不只做 2 次查询以使其更好。对 1 衬里的要求在这里没有任何意义:P。你仍然有唯一的解决方案:-P
      • @Michael 我们可以对什么是 1 查询很挑剔,从连接的角度来看,这将只需要一个到数据库服务器的连接。从数据库的角度来看,确定子查询是查询。
      • @TDSii 唯一的性能损失将是数据的大小,即添加的列以及每行的大小。 Mysql 足够聪明,只计算一次子查询。只是为了确定,你不能用交叉连接做同样的事情。计算时间甚至可能比发送两个查询要短。
      【解决方案3】:

      虽然我已经看到了一些不好的方法,但当我之前研究过这个时,有两种普遍接受的解决方案:

      1. 运行您的查询,然后使用 count 运行相同的查询,就像您在问题中所做的那样。

      2. 运行查询,然后使用 SQL_CALC_FOUND_ROWS 关键字再次运行。

      例如。 SELECT SQL_CALC_FOUND_ROWS * FROM table LIMIT 0,10

      这第二种方法就是 phpMyAdmin 的做法。

      【讨论】:

        【解决方案4】:

        您可以运行第一个查询,然后运行第二个查询,这样您将获得计数和第一个结果。

        查询返回一组记录。该计数绝对不是“SELECT *”查询可以返回的记录之一,因为整个结果集只有一个计数。

        无论如何,您并没有说明您运行这些 SQL 查询的编程语言以及您使用的接口。可能界面中存在这个选项。

        【讨论】:

          【解决方案5】:

          选择 SQL_CALC_FOUND_ROWS 您的查询在这里 限制...

          不运行任何其他查询或破坏会话然后运行 选择 FOUND_ROWS();

          你会得到总行数

          【讨论】:

            【解决方案6】:

            2 个查询的问题是一致性。在 2 次查询之间,数据可能会发生变化。如果您的逻辑取决于必须返回的计数,那么您唯一的方法是使用 SQL_CALC_FOUND_ROWS。

            从 Mysql 8.0.17 开始,SQL_CALC_FOUND_ROWS 和 FOUND_ROWS() 将被弃用。删除此功能后,我不知道有一致的解决方案。

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2012-10-06
              • 1970-01-01
              • 1970-01-01
              • 2016-04-28
              • 1970-01-01
              • 2021-01-29
              相关资源
              最近更新 更多