【问题标题】:How to get the number of total results when there is LIMIT in query?查询中有LIMIT时如何获取总结果数?
【发布时间】:2015-11-30 03:45:08
【问题描述】:

我有一个这样的查询:

select * from table where id <= 10 limit 5;  // table has +10 rows

上述查询 ^ 的结果数为 10 行。现在我想知道,我怎样才能得到这个查询的总结果数:

select * from table where col = 'anything' limit 5;

如何计算这个^中所有结果的个数(不管limit

其实我想要这个号码:

select count(*) as total_number from table where col = 'anything'

现在我想知道如何在不进行其他查询的情况下获得总结果数。

【问题讨论】:

  • 因为我喜欢告诉用户所有匹配结果的数量以及他看到的数字的数量,如下所示:显示第 0-5 行(共 34 行)我>
  • @Strawberry 什么?用户只是使用我的网站。实际上,我的网站类似于 google (搜索引擎)
  • @Strawberry 这个函数只计算结果的数量。因此,如果查询中有limit,则该 PHP 函数的输出将等于或小于限制数。在这种情况下:mysqli_num_rows &lt;= 5!虽然我需要总结果的数量,但不管limit
  • @Strawberry 您链接的内容与我的问题不同。这个问题解释了found_roews() 的工作原理。但我想同时选择有限的数据和匹配结果的总数为无限。
  • FOUND_ROWS 返回“无限”结果集。 mysqli_num_rows 返回结果集中的行数。它肯定比下面提供的答案更快。你还需要什么?

标签: mysql sql


【解决方案1】:

添加一列,total,例如:

select t.*
     , (select count(*) from tbl where col = t.col) as total
from tbl t
where t.col = 'anything'
limit 5

@Tim Biegeleisen 所述:limit 关键字应用在其他所有内容之后,因此 count(*) 仍然返回正确答案。

【讨论】:

  • 我测试了这个查询,但是它有一个语法错误(根据phpmyadmin所说的)。请您看一下,如果有错误,请修复它?
  • 在此错误中,我用“table”替换了我的真实表名,用“col”替换了我的真实列名:#1064 - 您的 SQL 语法有错误;检查与您的 MySQL 服务器版本相对应的手册,以获取正确的语法,以便在表 t 中使用 ') 作为总数,其中 match(t.col) against('anything') limit 5' at line 1 *跨度>
  • 请注意,RDBMS 表中的行表示无序集,因此没有 ORDER BY 的 LIMIT 是一个相当没有意义的概念。
  • 现在没有任何错误并且可以正常工作。但不正确。输出总是一行。 (但是有一个total 列也显示了总结果的数量).
  • @Strawberry 此当前查询不需要order by。因为结果总是只有一行。
【解决方案2】:

您需要查询中的 SQL_CALC_FOUND_ROWS 选项和 FOUND_ROWS() 函数来执行此操作:

DECLARE @rows int
SELECT SQL_CALC_FOUND_ROWS * from table where col = 'anything' limit 5;

SET @rows = FOUND_ROWS(); --for a later use

【讨论】:

  • 这是查找预限制记录数的正确方法。
  • @RavinderReddy 那么在这种情况下哪个是正确答案?
  • 作为 输出解决方案 似乎都是正确的。但是为什么每行都有一个count?没有我相信的。因此,这应该是正确的答案。
  • 老实说,我不知道我应该如何使用它!有两个查询。那么,什么时候我必须执行它们?您可以在答案中添加更多代码吗?
  • SELECT @rows := FOUND_ROWS();
【解决方案3】:

使用子查询

select *, (select count(*) from table where col = 'anything') as total 
from table where col = 'anything' limit 5;

【讨论】:

  • 如果您的查询已经包含许多连接和子查询,这将变得很难做到。
猜你喜欢
  • 1970-01-01
  • 2011-08-21
  • 1970-01-01
  • 1970-01-01
  • 2013-06-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多