2013-03-28 3 views
1

Я создаю новую чат-систему с ColdFusion, но у меня возникли проблемы с решением небольшой проблемы.Закажите все запросы

Прежде всего я объясню, как работает система. При создании нового чата с кем-то он создает строку беседы в таблице MySQL conversations. После этого пользователи могут отправлять друг другу сообщения. При отправке сообщения строка вставляется в таблицу conversations_messages с меткой времени, пользователем, который отправил сообщение, сообщение и, конечно, идентификатор сообщения. Звучит логично, но теперь возникает большая проблема: организация всех этих сообщений.

Пользователи могут просматривать свои сообщения с другими на странице, это код этой страницы:

// 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

Я хочу, чтобы быть отсортированы по идентификатору сообщения, поэтому он показывает, как это:

enter image description here

Надеюсь, теперь это немного яснее! Помощь будет оценена!

+1

В этом последнем абзаце вы потеряли меня :) Можете ли вы опубликовать образец фактического вывода - и что вы хотели бы видеть вместо этого? – Leigh

+0

(.. также, вы забыли заказать второй запрос 'conversations_messages.id DESC'?) – Leigh

+3

Полагает, что следующим шагом является запрос объединения запросов между запросами my и friend, упорядоченный по метке времени. –

ответ

3

(не знаю, почему все отвечает в комментарии, а не как «ответ»?)

Порядок, в котором ваши результаты будут возвращены из БД чисто вплоть до того, вы говорите им быть возвращены. Поэтому, если вы хотите, чтобы они были хронологически, то не выставляйте их по имени; упорядочить их в хронологическом порядке.

Так что не получайте сообщения пользователя1, а затем сообщения user2, просто получите сообщения для всего разговора в порядке разговора. Затем, когда вы выводите их, посмотрите, какой пользователь сделал, который комментирует и выполняет «вы»/«друг».

Это, я думаю, подход, который вы принимаете, не идеален. То, что вы, возможно, должны делать, - это получать сообщения поэтапно, поскольку они происходят, а не ждать, чтобы получить все из них (если вы понимаете, что я имею в виду). Таким образом, пользовательский интерфейс каждого человека получает все сообщения с момента последнего отображаемого сообщения и отображает их (в хронологическом порядке), затем ждет некоторый интервал опроса, а затем извлекает следующую партию сообщений, которые произошли с последнего раза (и т. Д.), ,

Если вы используете ColdFusion 10, все это уже сделано для вас через технологию веб-сокетов CF. Так что это был бы путь, если это вариант для вас.

+0

* получение сообщений постепенно * Возможно, эти запросы предназначены для какой-либо страницы истории чата. В этом случае это имело бы смысл. В противном случае, я согласен. Инкрементальные тяги - намного лучший способ пойти. – Leigh

+1

Привет @Ligh. Это может быть, но вопрос сформулирован так, чтобы предложить этот код для «как происходит чат». Тем не менее: рассмотрение обеих ситуаций - хороший хэдз-ап. –

+0

Да, я подозреваю, что это для чата в режиме реального времени. Но, как вы сказали, хорошо смотреть на это с разных точек зрения. – Leigh

2

(как Адам предложил здесь ответ)

Мне кажется, что ваш запрос getmessages имеет то, что вы после этого. Это все сообщения от этого conversation = chat, заказанные conversations_messages.id.

Вы также не должны запрашивать *, укажите только нужные столбцы. Таким образом, вы получите лучшую производительность.

Кроме того, всегда используйте теги <cfqueryparam> в своих блоках cfquery.

Кроме того, вы не можете вложить <cfoutput> теги без атрибута group.Ваш код уже находится в <cfoutput>, поэтому нет необходимости в другом.

Если вы находитесь на ColdFusion 10, я определенно дам ответ @ Adam.

+0

* вы не можете вложить '' теги * .. и на эту тему @Yannick, никогда не запускайте запросы * внутри * цикл, если вы можете помочь, потому что вы ударяете базу данных один раз для каждой записи в запросе. Это очень неэффективно и обычно ... совершенно ненужно. – Leigh

Смежные вопросы