使用相同的查询获取mysql的限制总数?

时间:2011-03-11 23:11:25

标签: mysql limit

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

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

我现在拥有的:

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

6 个答案:

答案 0 :(得分:12)

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

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

答案 1 :(得分:3)

您可以使用子查询执行此操作:

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

但我不认为这有任何好处。

编辑:像Ilya所说的那样,总计数和行的含义完全不同,想要在同一个查询中检索这些数据并不存在真正的意义。我会坚持这两个问题。我刚才给出了这个答案,表明这是可能的,而不是一个好主意。

答案 2 :(得分:3)

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

  1. 运行查询,然后使用count运行与问题相同的查询。

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

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

    第二种方法是phpMyAdmin如何做到这一点。

答案 3 :(得分:2)

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

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

无论如何,您没有说明您运行这些SQL查询的编程语言以及您正在使用的界面。也许这个选项存在于界面中。

答案 4 :(得分:2)

SELECT SQL_CALC_FOUND_ROWS 你在这里查询 限制......

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

您将得到总行数

答案 5 :(得分:0)

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

自Mysql 8.0.17起,将不推荐使用SQL_CALC_FOUND_ROWS和FOUND_ROWS()。删除此功能后,我不知道有一个一致的解决方案。