我正在制作一种分页方法,我所做的是: 第一个查询将计算所有结果,第二个查询将使用LIMIT进行正常选择
技术上是否有任何方法可以做到这一点,但只有一个查询?
我现在拥有的:
SELECT count(*) from table
SELECT * FROM table LIMIT 0,10
答案 0 :(得分:12)
没有人真正提到这一点,但使用SQL_CALC_FOUND_ROWS
技术的正确方法是这样的:
SELECT SQL_CALC_FOUND_ROWS * FROM `table` LIMIT 0, 10
SELECT FOUND_ROWS()
。此查询的结果包含上一个查询的完整计数,即好像您没有使用LIMIT
子句。第二个查询立即快速,因为结果已经被缓存。答案 1 :(得分:3)
您可以使用子查询执行此操作:
select
*,
(select count(*) from mytable) as total
from mytable LIMIT 0,10
但我不认为这有任何好处。
编辑:像Ilya所说的那样,总计数和行的含义完全不同,想要在同一个查询中检索这些数据并不存在真正的意义。我会坚持这两个问题。我刚才给出了这个答案,表明这是可能的,而不是一个好主意。
答案 2 :(得分:3)
虽然我已经看到了一些不好的方法,但是当我之前研究过这个时,有两个普遍接受的解决方案:
运行查询,然后使用count
运行与问题相同的查询。
运行您的查询,然后使用SQL_CALC_FOUND_ROWS
关键字再次运行。
例如。 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()。删除此功能后,我不知道有一个一致的解决方案。