1

我正在使用 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 排序,所以它显示如下:

在此处输入图像描述

我希望现在更清楚一点!帮助将不胜感激!

4

2 回答 2

3

(不知道为什么每个人都在评论中回答而不是作为“答案”?)

从数据库返回结果的顺序完全取决于您告诉它们返回的顺序。因此,如果您要按时间顺序排列它们,请不要按名称排序;按时间顺序排列它们。

所以不要获取 user1 的消息,然后是 user2 的消息,只需按会话顺序获取整个会话的消息。然后当你输出它们时,看看哪个用户发表了哪个评论并做“你”/“朋友”的事情。

也就是说,我认为您采用的方法并不理想。您可能应该做的是在消息发生时逐步获取消息,而不是等待获取所有消息(如果您明白我的意思)。因此,在每个人的 UI 上获取自上次显示消息以来的所有消息,并显示它们(按时间顺序),然​​后等待一些轮询间隔,然后获取自上次显示以来发生的下一批消息(等等) .

如果您使用的是 ColdFusion 10,那么所有这些东西都已经通过 CF 的 Web Sockets 技术为您完成了。因此,如果这是您的选择,那将是您的选择。

于 2013-03-28T20:16:48.870 回答
2

(正如亚当在这里建议的那样是一个答案)

在我看来,您的查询getmessages有您所追求的。它看起来是来自此conversation = chat排序的所有消息conversations_messages.id

您真的不应该查询*任何一个,只指定所需的列。这样你会得到更好的表现。

此外,请始终<cfqueryparam>cfquery块中使用标签。

此外,您不能嵌套没有属性<cfoutput>的标签。group您的代码已经存在,<cfoutput>因此不需要另一个。

如果您使用的是 ColdFusion 10,我肯定会看一下@Adam 的答案。

于 2013-03-28T20:24:14.087 回答