我有一个循环sql查询的问题,如果查询不为null,那么我必须显示一些html标记。问题是,让我们说查询找到3个项目,它将显示3x文件而不是1x。
这是我的代码:
<cfquery name="client_id" datasource="#application.dsn#">
Select borrower_id,client_id,id from contracts where borrower_id = <cfqueryparam cfsqltype="cf_sql_integer" value="#trim(url.ID)#">
</cfquery>
<cfloop query="client_id">
<cfquery name="Payment_log" datasource="#application.dsn#">
SELECT *
FROM paymentLog
WHERE contract_id = <cfqueryparam value="#client_id.id#" maxlength="36" cfsqltype="CF_SQL_BIGINT">
AND DateDelete IS NULL
ORDER BY date_log, id
</cfquery>
<cfloop query="Payment_log">
<cfquery name="payment_log_file" datasource="#application.dsn#">
SELECT file_name
FROM paymentLog_file
WHERE log_id = #Payment_log.id#
</cfquery>
<cfloop query="payment_log_file">
<cfif payment_log_file.recordCount neq 0>
<th>file name</th>
</cfif>
</cfloop>
</cfloop>
</cfloop>
这是结果
<th>file name</th>
<th>file name</th>
<th>file name</th>
这就是我想要/需要的
<th>file name</th>
好的,所以我按照Matt Busche和Dan Bracuk的建议更改了我的SQL查询:
SELECT plf.log_id
FROM paymentLog pl
LEFT JOIN paymentLog_file plf ON pl.id = plf.log_id
WHERE contract_id = <cfqueryparam value="#client_id.id#" maxlength="36" cfsqltype="CF_SQL_BIGINT">
AND DateDelete IS NULL
ORDER BY plf.log_id, date_log, id
答案 0 :(得分:3)
你会想要比我做得更远,如果可能的话,将其减少到一个查询,但这应该让你走上正确的轨道
将两个内部查询合并为一个查询,在重复行类型上按属性添加订单,然后将group
个属性添加到cfloop
。如果您使用的是CF10?或者更低,您可能需要使用cfoutput
代替cfloop
才能使用group
属性
<cfquery name="client_id" datasource="#application.dsn#">
Select borrower_id,client_id,id from contracts where borrower_id = <cfqueryparam cfsqltype="cf_sql_integer" value="#trim(url.ID)#">
</cfquery>
<cfloop query="client_id">
<cfquery name="Payment_log" datasource="#application.dsn#">
SELECT pl.log_id log_id
FROM paymentLog pl
INNER JOIN paymentLog_file plf ON pl.log_id = plf.log_id
WHERE contract_id = <cfqueryparam value="#client_id.id#" maxlength="36" cfsqltype="CF_SQL_BIGINT">
AND DateDelete IS NULL
ORDER BY pl.log_id, date_log, id
</cfquery>
<cfloop query="Payment_log" group="log_id">
<th>file name</th>
</cfloop>
</cfloop>
答案 1 :(得分:2)
这是一个很长的评论。将其作为答案发布使我能够使其可读。
首先,在另一个查询的循环内运行查询很少是个好主意。您的问题中的代码表明您的SQL知识需要工作。为什么不从两个表中选择单个查询?如果您不知道如何做到这一点,我已经听过这本书的好消息,在10分钟内自学SQL。
其次,你说你只想显示三个中的一个记录。哪一个?如果您不知道,请询问想要完成此操作的人。这是在开始编写代码之前学习代码应该完成的一般类别。
答案 2 :(得分:1)
如果您只想返回1个文件,请在查询中说明。
# model/user.rb
has_many posts
has_many :comments
# model/post.rb
has_many comments
# model/comment.rb
belongs_to :user
belongs_to :post
如果要在该HTML标记内显示MULTIPLE文件,只需将循环包装在其中。
答案 3 :(得分:1)
我建议将整个查询合并到一个数据集中,然后使用它来构建输出。
SELECT c.borrower_id,c.client_id,c.id AS contracts_id
, pl.* /* But don't use *. Explicitly call only column names that you need. */
, plf.[file_name] /* Brackets because "file_name" is a built-in SQL function. */
FROM contracts c
LEFT OUTER JOIN paymentLog pl ON c.id = pl.contract_id
AND pl.DateDelete IS NULL
LEFT OUTER JOIN paymentLog_file plf ON plf.log_id = pl.id
WHERE c.borrower_id = <cfqueryparam cfsqltype="cf_sql_integer" value="#trim(url.ID)#">
ORDER BY pl.log_id, pl.date_log, pl.id /* Is this last ORDER BY needed? Which id are you wanting to sort on? Make sure it's in the SELECT. */
这也可以让您在一个批次中转储整个数据集,以便您可以看到您实际使用的内容。从这里你应该能够输出你想要的东西。
我还会在你将url.ID传递给你的cfqueryparam之前验证你的url.ID。