使用coldfusion的mysql查询性能

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

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

  1. <!-- This query returns 511 Units -->
  2. <cfquery name="getPropertyUnits" dataSource="rent">
  3. Select t.TenantID, u.UnitName
  4. From Units u
  5. INNER JOIN Tenants t on U.UnitID = t.UnitID
  6. Where u.Occupied = 1
  7. and u.PropertyID = 8
  8. and t.Prospect = 2
  9. Order By u.UnitName
  10. </cfquery>
  11. <!-- Loop the query getPropertyUnits -->
  12. <cfloop query="getPropertyUnits">
  13. <!-- Each loop interaction, I get the transactions -->
  14. <!-- Just hard code date for testing -->
  15. <cfquery dataSource="rent" name="getTransactions">
  16. Select * From TenantTransactions
  17. Where TenantID = #TenantID#
  18. AND TenantTransactionDate BETWEEN '2018-05-01' AND '2018-05-23'
  19. Order By TenantTransactionDate
  20. </cfquery>
  21. <!-- Loop the second query -->
  22. <cfloop query="getPropertyUnits">
  23. <!-- Work with data -->
  24. </cfloop>
  25. </cfloop>

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

dfty9e19

dfty9e191#

您可以联接所有三个表:

  1. SELECT t.TenantID, u.UnitName, tt.*
  2. FROM Units u
  3. INNER JOIN Tenants t ON U.UnitID = t.UnitID
  4. LEFT JOIN TenantTransactions tt ON tt.tenantid = t.id
  5. AND tt.TenantTransactionDate BETWEEN '2018-05-01' AND '2018-05-23'
  6. WHERE u.Occupied = 1
  7. AND u.PropertyID = 8
  8. AND t.Prospect = 2
  9. ORDER BY u.UnitName, tt.TenantTransactionDate

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

相关问题