coldfusion - 查询的查询或带有分组的循环

标签 coldfusion coldfusion-10

我有一个表,其中保存用户之间发送的消息的信息。它看起来像这样:

MessageID | MessageIDReference | MessageSubject   | Body     | Date
1           NULL                 Test               Hello      10/01/2014
2           1                    RE: Test           Goodbye    11/01/2014
3           1                    RE: Test           Hello      11/01/2014
.......
50          45                   RE: Subject        Blah       12/12/2014

因此创建的第一条消息将具有 NULL MessageIDReference 中的值列(因为它是一条新消息而不是回复)。当用户回复消息时,它会插入 MessageID将原始消息写入 MessageIDReference列,以便我们知道它回复的是哪条消息。又好又简单!

在我的网页上,我想显示对话中的第一条消息,然后在一个区域内显示对该消息的任何后续回复,以便轻松查看对话流程,如下所示:

<ol>
<cfloop query="messages">
<li>
  #MessageSubject# #Body#
      <ol>
      <!--- I want replies to this message here somehow --->
      <li>1st reply</li>
      <li>2nd reply</li>
      etc etc
      </ol>
</li>
  </cfloop>
<ol>

我认为这可以通过在每个 <cfloop> 中进行某种分组来完成标签,但我不知道如何。我现在认为必须在内部循环中使用查询的查询来完成,以便它返回每个 MessageID 的所有回复。并输出这些。

当我执行以下操作时,查询的查询会起作用:

<cfquery name="Messages">
    SELECT * FROM Messages
    </cfquery>

<ol>
  <cfquery type="query" name="MessagesNew">
    SELECT *
    FROM Messages
    WHERE MessageIDReference IS NULL
    </cfquery>
  <cfloop query="MessagesNew">
  <li> #MessagesNew.MessageSubject# #MessagesNew.Body#
    <cfquery type="query" name="MessagesReplies">
    SELECT *
    FROM Messages
    WHERE MessageIDReference = #MessagesNew.MessageID#
    </cfquery>
    <ol>
      <cfloop query="MessagesReplies">
      <li>#MessagesReplies.MessageSubject# #MessagesReplies.Body#</li>
      </cfloop>
    </ol>
  </li>
  </cfloop>
</ol>

最佳答案

Dan 提出了一个很好的建议,但这里有一个查询,可以获取原始消息以及任何回复 - 排序后第一行是原始消息,其余的都是按时间顺序排列的回复。

<cfquery type="query" name="MessagesReplies">
    SELECT *
    FROM Messages
    WHERE MessageIDReference = <cfqueryparam cf_sql_type="cf_sql_integer" value="#MessagesNew.MessageID#" />
    OR MessageID = <cfqueryparam cf_sql_type="cf_sql_integer" value="#MessagesNew.MessageID#" /> 
    ORDER BY MessageId, date
</cfquery>

当 MessageIDReference 为 NULL 时运行的查询将返回每个线程中的第一条消息,因此您需要根据 ID 选择该消息。

请注意 cfqueryparam 的使用,您应该始终参数化您的查询。永远。

关于coldfusion - 查询的查询或带有分组的循环,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21331649/

相关文章:

coldfusion - 如何在 CF10 中确定闭包变量的范围?

coldfusion - 是否有 cfscript 支持使用 group 属性循环查询

coldfusion - 在Coldfusion中以两种颜色格式化单元格上的文本

sql - CFML & SQL - 性能提升?

javascript - 如何在进入下一页之前验证单选按钮?

sql - 回滚后提交事务

javascript - 在 Javascript 中使用变量在调用查询的 cfml 标记内添加功能

java - 如何在两个结构上执行 "deep compare"或 "diff"?

iis - 严重 : Error in getRealPathFromConn