我有一个表,其中保存用户之间发送的消息的信息。它看起来像这样:
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/