使用coldfusion的mysql查询性能

hmmo2u0o  于 2021-06-21  发布在  Mysql
关注(0)|答案(1)|浏览(333)

我正在为一个旧项目使用coldfusion,并且在查询方面遇到了问题。我需要列出所有单位从我的单位表和每个单位的所有租户付款。它是使用loop-inside-loop构建的,这使得速度非常慢(代码如下):

<!-- 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>

有没有办法只进行一次查询并获取所有数据?
谢谢

dfty9e19

dfty9e191#

您可以联接所有三个表:

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

请记住,前两列( t.TenantID , u.UnitName )将重复多次:中的每行一次 TenantTransactions table。你需要在你的申请表中将它们分组。简单的逻辑就可以了。
不管怎样,这个查询比你现在做的要快得多。
另外,如果租户没有事务,则 tt.* 列将全部为空。记住这一点,因为它使用 left join . 这种连接对于确保显示所有租户是必需的,不管他们是否有事务。

相关问题