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