获取 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 />
一般来说,正如已经回答的那样,最好在尽可能靠近数据库的地方进行这种类型的计数。然而,有时您需要根据更多动态参数进行计数,或者您无权访问数据库 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 要点显示了这两种技术(均以脚本形式)
我知道您可以获得查询中返回的项目数,但是...
问题:是否可以获得具有特定值的 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 />
一般来说,正如已经回答的那样,最好在尽可能靠近数据库的地方进行这种类型的计数。然而,有时您需要根据更多动态参数进行计数,或者您无权访问数据库 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 要点显示了这两种技术(均以脚本形式)