mysql - 订购所有查询

标签 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

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

最佳答案

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

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

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

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

如果您使用的是 ColdFusion 10,则所有这些内容都已通过 CF 拥有的 Web 套接字技术为您完成。如果这是您的选择,那么这就是您的选择。

关于mysql - 订购所有查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15690353/

相关文章:

MySQL 更新表中的第一行

mysql - Excel 数组公式与 MySQL 等价

mysql - ColdFusion 参数化查询

java - ColdFusion 8 读取大型 Excel 文件

sql-server - MS-SQL 降序排序输出

coldfusion - cfcatch 是否停止处理?

mysql - Innodb 崩溃,mysql 直到服务器重新启动后才启动

mysql - SQL - 选择其列不遵循相同顺序的记录

mysql - 在我的 INNER JOIN 中使用 OR 子句

javascript - 清除更改功能的表单字段会删除表单发布值