gpt4 book ai didi

mysql - 如何在另一个查询中正确地 CFloop 查询?

转载 作者:行者123 更新时间:2023-11-29 20:33:37 24 4
gpt4 key购买 nike

背景/目的:我正在创建一个 Coldfusion 文档,其中包含用于从公司数据库中获取值的 SQL。我正在查找我们团队中每个销售代表的转化率(已售许可证/注册数)。每个销售代表都有一个与用户关联的 ID (RegionalDirectorID),以帮助跟踪。

问题:问题是我们还有其他工作人员在各处销售许可证,例如我们的首席执行官、首席开发人员等。我们有 8 名销售代表,其 UserType of 8。我正在使用另一个查询来选择这些用户类型,以与其他人区分开来,这样我们的数据就不会在选择它们时混淆。

正如您在下面看到的,我使用 cfloop 来循环 getUsers 查询,特别是为了帮助行(Users.RegionalDirectorID = #getUsers.UserID#) 打印出我们销售代表的所有 ID。 当我没有输入 cfloop 时,我只会看到一行显示一名销售代表。如果我有 cfloop,我将得到最后一个销售代表。

代码:

<cfset myQuery = QueryNew("ID, ConversionRate")> 

<cfquery name="getUsers" datasource="#dsn#">
Select UserID FROM USERS WHERE
UserTypeID = 8
AND ISACTIVE = 1
</cfquery>

<cfquery name="getREGRD" datasource="#dsn#">
Select COUNT(DISTINCT(Users.UserID)) AS TOTALREG, RegionalDirectorID
FROM Users
WHERE UserTypeID = 3
<!--- <cfloop query="getUsers">
AND (Users.RegionalDirectorID = #getUsers.UserID#)
</cfloop>--->
AND (PARENTID IS NULL OR PARENTID = 0)
<cfif len(selectMonth)>
AND MONTH(Users.DateStamp) = #selectMonth#
<cfelse>
AND MONTH(Users.DateStamp) = #MONTH(NOW())#
</cfif>
GROUP BY Users.RegionalDirectorID
</cfquery>

<cfquery name="getREGRDSold" datasource="#dsn#">
Select COUNT(DISTINCT(UserTractLicense.UserID)) AS TOTALSOLD, Users.RegionalDirectorID
FROM Users, UserTractLicense
WHERE Users.UserID = UserTractLicense.UserID
AND Users.UserTypeID = 3 AND
(PARENTID IS NULL OR PARENTID = 0)
<cfif len(selectMonth)>
AND MONTH(Users.DateStamp) = #selectMonth#
<cfelse>
AND MONTH(Users.DateStamp) = #MONTH(NOW())#
</cfif>
GROUP BY Users.RegionalDirectorID
</cfquery>

<!---<cfset newRow = QueryAddRow(myQuery, #getREGRD.RecordCount#)>
<cfloop query="getREGRD">
<cfset QuerySetCell(myQuery, "ID", #getREGRD.RegionalDirectorID#, getREGRD.currentRow) />
</cfloop>
<cfloop query="getREGRDSold">
<cfset QuerySetCell(myQuery, "ConversionRate", #getREGRDSold.TOTALSOLD#/#getREGRD.TOTALREG#, getREGRDSold.currentRow) />
</cfloop>
--->

<!---<cfdump var="#myQuery#">--->
<cfdump var="#getREGRD#">
<cfdump var="#getREGRDSold#">

<cfoutput query="getREGRDSold">
#getREGRDSold.RegionalDirectorID#
</cfoutput>

cfloop 导致 newQuery 抛出以下错误。这就是为什么其中一些被注释掉的原因:

An error occurred while evaluating the QueryAddRow function: Parameter> 2, 0, of the QueryAddRow function must be a positive integer.
The error occurred on line 70.

结果数据中有一些 UserTypeID 不为 8 的 RegionalDirectorID,例如 NULL 单元格,我想从查询结果中删除它们。

Sample Results

最佳答案

听起来您所需要的只是一个 JOIN,而不是所有额外的循环和查询。

如果Users同时存储客户和销售代表,您将需要 self join 。换句话说,使用 aliasesUsers 表与其自身连接起来。 。然后根据适当的用户类型过滤每一项。像这样的事情:

SELECT  cust.RegionalDirectorID
, COUNT(DISTINCT(lic.UserID)) AS TOTALSOLD
FROM Users cust
INNER JOIN Users sales ON sales.UserID = cust.RegionalDirectorID
INNER JOIN UserTractLicense lic ON lic.UserID = cust.UserID
<!--- customers --->
WHERE cust.UserTypeID = 3
<!--- sales reps --->
AND sales.UserTypeID = 8
... etcetera
GROUP BY cust.RegionalDirectorID

其他一些评论:

  1. 虽然技术上并不总是需要,但每当查询涉及多个表时,完全限定所有列名称是一个好习惯。

  2. 同样,请确保确定所有变量的范围。例如,使用 FORM.selectMonthURL.selectMonth 而不仅仅是 selectMonth

  3. 始终对所有可变查询参数使用cfqueryparam。最重要的原因是保护您的数据库免受 SQL 注入(inject)。它还有助于提高多次执行查询的性能。

MONTH(Users.DateStamp) = #selectMonth#

  • 我注意到查询仅过滤月份号(而不是月份年)。因此,如果 selectedMonth = 8,则查询将返回任何年份“八月”的结果。这是你的意图吗?如果没有,您显然还需要添加年份过滤器。但是,在索引列上使用函数通常会阻止数据库利用索引。所以你可能会考虑使用 this paradigm which is more index friendly :

     WHERE  TheDateColumn >= TheStartDateAtMidnight         
    AND TheDateColumn < TheDayAfterEndDateAtMidnight
  • 关于mysql - 如何在另一个查询中正确地 CFloop 查询?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38904685/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com