使用ColdFusion查询性能

Max*_*Boy 1 mysql sql coldfusion

我正在使用coldfusion进行旧项目,我遇到了查询问题.我需要从我的单位表中列出所有单位,并为每个单位列出所有租户付款.它是使用循环内部循环构建的,这非常慢(代码如下):

    <!-- This query returns 511 Units -->
<cfquery name="getPropertyUnits" dataSource="rent">
    Select t.TenantID, u.UnitName
    From Units u
    INNER JOIN Tenants t on U.UnitID = t.UnitID
    Where u.Occupied = 1
    and u.PropertyID = 8
    and t.Prospect = 2
    Order By u.UnitName
</cfquery>

<!-- Loop the query getPropertyUnits -->
<cfloop query="getPropertyUnits">

    <!-- Each loop interaction, I get the transactions -->
    <!-- Just hard code date for testing -->
    <cfquery dataSource="rent" name="getTransactions">
            Select * From TenantTransactions
            Where TenantID = #TenantID#
            AND TenantTransactionDate BETWEEN '2018-05-01' AND '2018-05-23'
            Order By TenantTransactionDate
    </cfquery>

    <!-- Loop the second query -->
    <cfloop query="getPropertyUnits">
        <!-- Work with data -->
    </cfloop>

</cfloop>
Run Code Online (Sandbox Code Playgroud)

有没有办法只做一个查询并获取所有数据?

谢谢

The*_*ler 5

您可以加入所有三个表:

SELECT  t.TenantID, u.UnitName, tt.*
  FROM  Units u
        INNER JOIN Tenants t ON U.UnitID = t.UnitID
        LEFT JOIN TenantTransactions tt ON tt.tenantid = t.id
    AND tt.TenantTransactionDate BETWEEN '2018-05-01' AND '2018-05-23'
  WHERE u.Occupied = 1
    AND u.PropertyID = 8
    AND t.Prospect = 2
  ORDER BY u.UnitName, tt.TenantTransactionDate
Run Code Online (Sandbox Code Playgroud)

请记住,前两列(t.TenantID,u.UnitName)将重复多次:TenantTransactions表中每行一次.您需要在应用程序中将它们分组.简单的逻辑就可以了.

无论如何,这个查询比你现在正在做的要快得多.

此外,如果租户没有事务,则tt.*列中的值都将为null.记住这一点,因为它使用了left join.这种联接对于确保所有租户都被展示是必要的,无论他们是否有交易.