Coldfusion循环遍历查询并仅显示html标记一次

时间:2017-03-25 12:16:13

标签: sql loops coldfusion coldfusion-10 coldfusion-11

我有一个循环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

我明白了: SQL Result

这就是我得到的 Current situation

这就是我想要/需要的 This is what i need/want

4 个答案:

答案 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。