【发布时间】:2011-03-11 23:11:25
【问题描述】:
我正在制作一种分页方法,我所做的是: 第一个查询将计算所有结果,第二个查询将使用 LIMIT 进行正常选择
技术上是否有任何方法可以做到这一点,但只有一个查询?
我现在拥有的:
SELECT count(*) from table
SELECT * FROM table LIMIT 0,10
【问题讨论】:
我正在制作一种分页方法,我所做的是: 第一个查询将计算所有结果,第二个查询将使用 LIMIT 进行正常选择
技术上是否有任何方法可以做到这一点,但只有一个查询?
我现在拥有的:
SELECT count(*) from table
SELECT * FROM table LIMIT 0,10
【问题讨论】:
没有人真正提到这一点,但是使用SQL_CALC_FOUND_ROWS 技术的正确方法是这样的:
SELECT SQL_CALC_FOUND_ROWS * FROM `table` LIMIT 0, 10
SELECT FOUND_ROWS()。此查询的结果包含上一个查询的完整计数,即好像您没有使用 LIMIT 子句一样。第二个查询很快,因为结果已经被缓存了。【讨论】:
您可以使用子查询来做到这一点:
select
*,
(select count(*) from mytable) as total
from mytable LIMIT 0,10
但我不认为这有任何优势。
edit:就像 Ilya 所说,总计数和行具有完全不同的含义,想要在同一个查询中检索这些数据没有真正意义。我会坚持这两个查询。我给出这个答案只是为了表明这是可能的,而不是一个好主意。
【讨论】:
count(*)的结果,写这样的查询是没有意义的。可悲的是,我认识一些程序员,他们会在不眨眼的情况下这样做。
虽然我已经看到了一些不好的方法,但当我之前研究过这个时,有两种普遍接受的解决方案:
运行您的查询,然后使用 count 运行相同的查询,就像您在问题中所做的那样。
运行查询,然后使用 SQL_CALC_FOUND_ROWS 关键字再次运行。
例如。 SELECT SQL_CALC_FOUND_ROWS * FROM table LIMIT 0,10
这第二种方法就是 phpMyAdmin 的做法。
【讨论】:
您可以运行第一个查询,然后运行第二个查询,这样您将获得计数和第一个结果。
查询返回一组记录。该计数绝对不是“SELECT *”查询可以返回的记录之一,因为整个结果集只有一个计数。
无论如何,您并没有说明您运行这些 SQL 查询的编程语言以及您使用的接口。可能界面中存在这个选项。
【讨论】:
选择 SQL_CALC_FOUND_ROWS 您的查询在这里 限制...
不运行任何其他查询或破坏会话然后运行 选择 FOUND_ROWS();
你会得到总行数
【讨论】:
2 个查询的问题是一致性。在 2 次查询之间,数据可能会发生变化。如果您的逻辑取决于必须返回的计数,那么您唯一的方法是使用 SQL_CALC_FOUND_ROWS。
从 Mysql 8.0.17 开始,SQL_CALC_FOUND_ROWS 和 FOUND_ROWS() 将被弃用。删除此功能后,我不知道有一致的解决方案。
【讨论】: