订购所有查询

时间:2013-03-28 19:19:30

标签: mysql coldfusion

我正在使用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>

这就是现在结果的显示方式:(因为你可以看到它按用户排序)

enter image description here

我希望它按消息ID排序,因此它显示如下:

enter image description here

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

2 个答案:

答案 0 :(得分:3)

(不确定为什么每个人都在回答评论而不是#34;答案&#34;?)

从DB返回结果的顺序完全取决于您告诉他们返回的顺序。所以,如果你想按时间顺序排列它们,那就不要按名字命名它们;按时间顺序排列。

因此,不要获取用户1的消息,然后获取用户2的消息,只需按会话顺序获取整个会话的消息。然后,当您输出它们时,请查看哪个用户制作了哪条评论并执行了“#34;您&#34; /&#34;朋友&#34;东西。

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

如果你正在使用ColdFusion 10,那么所有这些东西都已经通过CF的Web套接字技术为你完成了。如果这对你来说是个选择,那将是一条路。

答案 1 :(得分:2)

(正如亚当在这里建议的那样)

在我看来,您的查询getmessages具有您所追求的目标。它似乎是conversation = chatconversations_messages.id排序的所有邮件。

你真的不应该查询*,只指定所需的列。你会以这种方式获得更好的表现。

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

此外,如果没有<cfoutput>属性,则无法嵌套group个标记。您的代码已经在<cfoutput>,因此无需其他代码。

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

相关问题