我正在使用ColdFusion创建一个新的聊天系统,但是我在解决一个小问题时遇到了很多麻烦。
首先,我将解释系统的工作原理。在与某人创建新聊天时,它会在MySQL表conversations
中创建一个对话行。之后,用户可以互相发送消息。发送消息时,会在表conversations_messages
中插入一行,其中包含时间戳,发送消息的用户,消息,当然还有消息的ID。听起来合乎逻辑,但现在出现了一个大问题:组织所有这些消息。
用户可以在页面上与他人一起查看他们的消息,这是该页面的代码:
// Check conversation ID based on page url
<cfif IsDefined('URL.chat') and URL.chat neq "">
// Load conversation based on page url
<cfquery name = "getconv" datasource = "#DSN#">
SELECT *
FROM `conversations`
</cfquery>
// Get all messages from this conversation
<cfoutput query="getconv">
<cfquery name = "getmessages" datasource = "#DSN#">
SELECT *
FROM `conversations_messages`
WHERE `conversation` = '#chat#'
ORDER BY `conversations_messages`.`id` DESC
</cfquery>
// Get messages sent by 'user_one'
<cfquery name = "my" datasource = "#DSN#">
SELECT *
FROM `conversations_messages`
WHERE `conversation` LIKE '#chat#'
AND `user` LIKE '#user.id#'
ORDER BY `conversations_messages`.`id` DESC
</cfquery>
// Get messages sent by 'user_two'
<cfquery name = "friend" datasource = "#DSN#">
SELECT *
FROM `conversations_messages`
WHERE `conversation` LIKE '#chat#'
AND `user` LIKE '#getconv.user_two#'
</cfquery>
<div class="content">
// Messages sent by 'user_one' aka. user that created conversation
You: <cfoutput><cfloop query="my">#my.message#<br></cfloop></cfoutput>
// Messages sent by 'user_two'
Friend: <cfoutput><cfloop query="friend">#friend.message#</cfloop></cfoutput>
</cfoutput>
</div>
</cfif>
这就是现在结果的显示方式:(因为你可以看到它按用户排序)
我希望它按消息ID排序,因此它显示如下:
我希望现在有点清楚了! 帮助将不胜感激!
答案 0 :(得分:3)
(不确定为什么每个人都在回答评论而不是#34;答案&#34;?)
从DB返回结果的顺序完全取决于您告诉他们返回的顺序。所以,如果你想按时间顺序排列它们,那就不要按名字命名它们;按时间顺序排列。
因此,不要获取用户1的消息,然后获取用户2的消息,只需按会话顺序获取整个会话的消息。然后,当您输出它们时,请查看哪个用户制作了哪条评论并执行了“#34;您&#34; /&#34;朋友&#34;东西。
那就是说,我认为你采取的方法并不理想。你可能应该做的是在消息发生时逐步获取消息,而不是等待获取所有消息(如果你看到我的意思)。因此,在每个人的UI上获取自上次显示的消息以来的所有消息,并显示&#em; em(按时间顺序),然后等待一些轮询间隔,然后获取已发生的下一批消息自上次以来(等)。
如果你正在使用ColdFusion 10,那么所有这些东西都已经通过CF的Web套接字技术为你完成了。如果这对你来说是个选择,那将是一条路。
答案 1 :(得分:2)
(正如亚当在这里建议的那样)
在我看来,您的查询getmessages
具有您所追求的目标。它似乎是conversation = chat
按conversations_messages.id
排序的所有邮件。
你真的不应该查询*
,只指定所需的列。你会以这种方式获得更好的表现。
此外,请始终在<cfqueryparam>
块中使用cfquery
标记。
此外,如果没有<cfoutput>
属性,则无法嵌套group
个标记。您的代码已经在<cfoutput>
,因此无需其他代码。
如果您使用ColdFusion 10,我肯定会给@ Adam的答案一看。