忽略LIMIT语句获取计数查询结果

时间:2014-03-25 07:45:19

标签: mysql sql

我有一个简单的查询如下:

$q = "SELECT * FROM blah WHERE disabled = '0'";

现在为了分页,我需要在查询中添加LIMIT,所以:

$q = "SELECT * FROM blah WHERE disabled = '0' LIMIT 10,20";

仍然,我想知道mysql_num_rows所有行的数量,但在上面的查询中它总是10,因为我限制了结果,所以对于我需要的所有行的数量在没有LIMIT语句的情况下再次执行相同的查询。

以某种方式运行相同的查询两次以获取所有行的数量是不是很愚蠢,任何人都有更好的解决方案?

由于

5 个答案:

答案 0 :(得分:10)

MySQL supports a FOUND_ROWS() function查找从上一个有限查询返回的无限数量的行。

SELECT SQL_CALC_FOUND_ROWS * FROM blah WHERE disabled = '0'  LIMIT 10,20
SELECT FOUND_ROWS();

请注意:(a)您需要包含SQL_CALC_FOUND_ROWS选项,以及(b)这是一个特定的MySQL扩展,不能在另一个RDBMS上运行(尽管它们每个可能有自己的方式这样做。)

这不一定是最好的做事方式,即使它可能是这样的;你仍然需要发布两个语句,你引入了非标准的SQL,实际的COUNT可能与简单的SELECT COUNT(*)...速度相似。我本人倾向于坚持标准的做法。

答案 1 :(得分:1)

如果您想知道总结果,则需要两个查询,但COUNT忽略LIMIT因此,您可以执行以下操作:

SELECT * FROM blah WHERE disabled = '0' LIMIT 10,20 // Give 10 rows 

SELECT COUNT(*) FROM blah WHERE disabled = '0' LIMIT 10,20 // Give you a count of ALL records

答案 2 :(得分:0)

对于分页,您必须运行计数查询才能获得总计。

$q = "SELECT count(*) FROM blah WHERE disabled = '0'";

两个查询必要

答案 3 :(得分:0)

$total = "SELECT count(*) FROM blah WHERE disabled = '0'";

if($total > 0)
{
    $q = "SELECT * FROM blah WHERE disabled = '0' LIMIT 0,10";
}

包含分页类并动态调用LIMIT和OFFSET会更好。

答案 4 :(得分:0)

有几种方法可以做到这一点,

如果您知道数据没有,首先可以缓存总行数 改变很多 - 不是一个很好的解决方案,我至少不喜欢它。

其次,您可能需要查看SQL_CALC_FOUND_ROWS,但有时COUNT(*)更快 因为第一个将扫描整个表,而count将扫描索引。由你决定 测试和使用你想要的东西。

如果您没有大量数据,SQL_CALC_FOUND_ROWS将是一个很好的解决方案。