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

(なぜ「回答」ではなくコメントで回答しているのかわかりませんか?)

結果が DB から返される順序は、返されるように指示した順序に完全に依存します。したがって、それらを時系列で取得する場合は、名前順にフェッチしないでください。それらを時系列に並べます。

したがって、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 に答える