我正在使用 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 排序,所以它显示如下:
我希望现在更清楚一点! 帮助将不胜感激!
最佳答案
(不确定为什么每个人都在评论中回答而不是作为“答案”?)
您的结果从数据库返回的顺序完全取决于您告诉它们返回的顺序。因此,如果您希望按时间顺序排列它们,则不要按名称顺序获取它们;按时间顺序排列。
所以不要获取user1的消息,然后获取user2的消息,只获取整个 session 的消息,按 session 顺序。然后当你输出它们时,看看哪个用户发表了哪些评论,然后做“你”/“ friend ”的事情。
也就是说,我认为您采用的方法不太理想。您或许应该做的是在消息发生时逐步获取消息,而不是等待获取所有消息(如果您明白我的意思)。所以在每个人的 UI 上获取自上次显示消息以来的所有消息,并显示它们(按时间顺序),然后等待一些轮询间隔,然后获取自上次以来发生的下一批消息(等等) .
如果您使用的是 ColdFusion 10,则所有这些内容都已通过 CF 拥有的 Web 套接字技术为您完成。如果这是您的选择,那么这就是您的选择。
关于mysql - 订购所有查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15690353/