获取 cfquery 中返回的特定行数

Get count of specifc rows returned in cfquery

我知道您可以获得查询中返回的项目数,但是... 问题:是否可以获得具有特定值的 recordcount 行,例如...

<cfset totalReturned = myquery.recordcount>

<cfset totalReturnedComplete = myquery.recordcount (where status = "Complete")>

我知道上面的方法行不通,但我正在寻找类似上面代码的东西。

你有几个选择。您可以使用在 status = "Complete" 时递增的计数器遍历查询,或者您可以使用查询查询:

<cfquery name="mynewquery" dbtype="query">
    SELECT status, COUNT(*) AS status_cnt
      FROM myquery
     GROUP BY status
</cfquery>

但是,由于您使用的是 SQL 服务器,另一种方法是修改您的初始查询(假设您有权执行此操作),以便 status = "Complete" 返回,使用 SUM() 作为 window 函数:

<cfquery name="myquery" datasource="mydatasource">
    SELECT id, status
         , SUM(CASE WHEN status = 'Complete' THEN 1 ELSE 0 END) OVER ( ) AS complete_cnt
      FROM mytable
</cfquery>

<cfset totalReturned = myquery.recordcount />
<cfset totalReturnedComplete = myquery.complete_cnt />

See SQL Fiddle here.

一般来说,正如已经回答的那样,最好在尽可能靠近数据库的地方进行这种类型的计数。然而,有时您需要根据更多动态参数进行计数,或者您无权访问数据库 server/service。在这些情况下,您可以使用查询中的查询,或者如果使用 CF11+,则可以使用 arrayFilter。

arrayFilter 的示例类似于:

... snipped, see link below for full runnable example
// convert query to array of structs
peopleArray = deserializeJSON(serializeJSON(people,"struct"));
// filter the array as needed
notMatt = peopleArray.filter( function(a){
    return a.firstname != 'Matt';
});

然后您可以使用 len()arrayLen() 函数来获取计数:即 notMatt.len()

查询选项的查询可能更快,尚未进行任何基准测试,但这看起来像:

<cfquery dbtype="query" name="notMatt">
    SELECT count(*) as total 
    WHERE firstname != 'Matt'
</cfquery>

那么您只需使用 noMatt.total。下面的 trycf 要点显示了这两种技术(均以脚本形式)

TryCF.com Examples