2013-03-28 128 views
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> 

這是結果如何顯示現在:(你可以看到它是由用戶排序)

enter image description here

我希望它由信息ID進行排序,所以它顯示是這樣的:

enter image description here

我希望現在有點清楚! 幫助將不勝感激!

+1

最後一段是你失去我的地方:)你能發表一個實際輸出的樣本 - 而你想看到什麼呢? – Leigh

+0

(..還有,你忘了通過'conversations_messages.id DESC'命令第二個查詢嗎?) – Leigh

+3

在我看來,下一步是查詢我和朋友之間查詢的聯合查詢,按時間戳排序。 –

回答

3

(不知道爲什麼每個人都在評論,而不是「答案」?回答)

,你的結果是從數據庫返回的順序完全歸結到你告訴他們要返回的順序。所以如果你想按時間順序排列,那麼不要按名字排列。按時間順序排列。

因此,不要獲取user1的消息,然後獲取user2的消息,只需按照對話順序獲取整個對話的消息即可。然後當你輸出它們時,看看哪個用戶做了哪些評論,並做「你」/「朋友」的東西。

這就是說,我認爲你採取的方法並不理想。你應該做的或許是逐步提取消息,而不是等待所有消息(如果你明白我的意思)。因此,在每個人的用戶界面上都會顯示自上次顯示的消息以來的所有消息,並顯示'em(按時間順序),然​​後等待某個輪詢間隔,然後獲取自上次以來發生的下一批消息(等等) 。

如果您使用ColdFusion 10,所有這些東西都已經通過CF的Web Sockets技術爲您完成。所以如果這是您的選擇,這將是一條路。

+0

*增量提取郵件*這些查詢可能適用於某種「聊天記錄」頁面。在這種情況下,這是有道理的。否則,我同意。增量拉動是更好的方法。 – Leigh

+1

Hi @Leigh。它可能是,但問題是措辭表明這個代碼是「隨着聊天的發生」。仍然:考慮到這兩種情況是一個很好的單挑。 –

+0

是的,我懷疑這是「實時」聊天。但正如你所說,從不同的角度來看它是很好的。 – Leigh

2

(亞當建議這裏是一個答案)

在我看來,你的查詢getmessages有你所追求的。它看起來是由conversations_messages.id訂購的這個conversation = chat的所有消息。

您確實不應該查詢*,只需指定所需的列。這樣你會獲得更好的表現。

此外,總是在您的cfquery區塊中使用<cfqueryparam>標籤。

此外,您不能嵌套<cfoutput>標籤沒有group屬性。您的代碼已經在<cfoutput>中,因此不需要其他代碼。

如果你在ColdFusion 10上,我肯定會給@ Adam的回答一下。

+0

*您不能嵌套''標籤* ..並且在該主題上@Yannick,如果您可以幫助它,請不要在*循環內運行查詢*,因爲您在查詢中的每條記錄都會敲擊一次數據庫。這是非常低效的,通常......完全沒有必要。 – Leigh