查找使用Limit的查询的总行数

时间:2014-06-04 06:10:21

标签: mysql coldfusion

我有一个函数,它返回X行,其中X是用户选择的参数。我知道我可以在查询中使用SQLCALCFOUND_ROWS,但我必须使用select foundrows();之后立即。如果在我的cfquery标记内的主查询之后使用select foundrows(),则仅返回总行的值。如果我在另一个cfquery中使用它,可能在mysql线程中有另一个查询,我的结果不可用。处理这个问题的更好方法是什么。

3 个答案:

答案 0 :(得分:1)

好的,所以我通过将查询包装在cftransaction中来实现它。请注意:仅当我的主要查询很大和/或运行时,我必须求助于此方法,因为子查询不能获得总记录数。 MySql声明SELECT FOUND_ROWS()应在使用SQL_CALC_FOUND_ROWS的查询后立即运行。如果我在相同的cfquery标记中运行它,则无法从主查询中访问数据。如果我运行另一个cfquery,则存在查询连接将返回池的风险。 @Leigh提到在cftransaction内运行两个查询可确保保留连接。 不是最好的解决方案,但比两次运行大量查询要好得多。

<cftransaction>    
    <cfquery name="qry1" datasource="dsn">
         select SQL_CALC_FOUND_ROWS col1,col2 from someTable
         some complex joins
         where a=b
    </cfquery>
    <cfquery name="qry2" datasource="dsn">
         select FOUND_ROWS() as TotalRows;
    </cfquery>
</cftransaction>

答案 1 :(得分:0)

此答案在很大程度上取决于查询的复杂性和时间成本。但是在一个简单的示例中,您可以将初始查询中的计数作为子选择进行构建。例如,如果您有国家/地区的表格,则可以执行以下操作以获得前10名和总数

select top 10 
  country_name
  ,(select COUNT(*) from country) as total
from 
  country

答案 2 :(得分:-1)

您可以只查询返回的查询对象。将查询的名称作为数据源提供,您可以在其上运行SQL。我相信你应该能够做一个select count(*)并计算从第一个查询返回的行。