我在coldfusion中创建了一个代码,从users和userstransactions表中加载数据并将其显示在表中。但是,我的查询需要很长时间才能运行。
<!--- This return about 250 records --->
<cfquery name="getUsers" datasource="db">
Select * From Users Where test = 5
</cfquery>
<!--- Loop to display the Users info --->
<cfloop query="getUsers">
<cfset SpecialDebit = 0 />
<cfset TotalDebit = 0 />
<cfset SpecialCredit = 0 />
<cfset TotalCredit = 0 />
<!--- Loop to get Users Balance --->
<cfquery name="getUsersTransactions" datasource="db">
SELECT * FROM UsersTransactions , TransactionTypes, ChargeTypes
Where UsersTransactions.TransactionTypeID=TransactionTypes.TransactionTypeID
AND ChargeTypes.ChargeTypeID=UsersTransactions.ChargeTypeID
AND UsersTransactions.UserID=#getUsers.UserID#
</cfquery>
<cfloop query="getUsersTransactions">
<cfif TransactionTypeID EQ "1"> <!--- This means it's a debit --->
<cfif ChargeTypeID EQ "6"> <!-- This means its a special debit --->
<cfset SpecialDebit += TransactionAmount />
<cfelse>
<cfset TotalDebit += TransactionAmount />
</cfif>
</cfif>
<cfif TransactionTypeID EQ "2"> <!--- This means it's a credit --->
<cfif ChargeTypeID EQ "6"> <!-- This means its a special credit --->
<cfset SpecialCredit += TransactionAmount />
<cfelse>
<cfset TotalCredit += TransactionAmount />
</cfif>
</cfif>
</cfloop>
<cfset UserSpecialBalance = SpecialDebit - SpecialCredit />
<cfset UserBalance = TotalDebit - TotalCredit />
<!--- Display User's data in a table with Column Special Balance and User Balance --->
.
.
.
</cfloop>
花费很长时间的是“getuserstransactions”查询的循环。有没有办法让这些查询运行得更快?
更新:
一个用户的数据示例:
User.UserID = 10
例如,它将在userstransactions中有6条记录
Transaction
# UserID TypeID ChargeTypeID TransactionAmount
1 10 1 6 25
2 10 1 6 17
3 10 1 1 50
4 10 2 1 12
5 10 2 6 7
6 10 2 6 18
在这种情况下,我有:
2“特殊借记”(记录1和2):特殊比特= 25+17 = 42
1正常借方(记录3):TotalDebt= 50
1正常信用(记录4):总信用= 12
2特别信贷(记录5和6):特别信贷= 7+18 = 25
2条答案
按热度按时间5w9g7ksd1#
我会使用这种程序流。它代表了总体思路。细节由你决定。
第1步-运行一个查询以获取所有数据。按用户id排序,因为您将使用cf的group属性。
第2步-开始在用户级别输出数据。然后对每个用户进行计算并输出结果。
您可以在文档中阅读有关cfoutput标记的group属性的更多信息。
3vpjnl9f2#
我上面的建议实际上相当于获取查询中所有用户所需的数据,然后输出这些结果,而不是循环为用户重新运行查询。我添加了一个使用查询的方法。
sql小提琴
mysql 5.6架构设置:
初始查询示例:注意:这可以进一步优化。
结果:
这将为用户标识1、3、4和5输出必要的字段,这些字段被过滤为test=5。因为表中似乎没有任何数据
TransactionTypes
以及ChargeTypes
,那些INNER JOIN
可以删除以显著加快查询速度。因此,当您使用cf时,可以简化查询。尝试:
注意:添加
ELSE 0
到CASE
语句将过滤掉NULL
查询中会中断求和的值。cf仍将这些结果显示为空白,但数据可能是错误的。