0

我在 ColdFusion 中制作了一个使用不同 MySQL 表的聊天脚本。一个是存储对话的地方,另一个是定义谁开始对话和谁接收对话的地方。

现在,我制作了一个脚本,让您可以与某人一起聊天。发送消息时,它会在 MySQL 表中添加一行,其中包含时间戳、消息 ID、发送消息的用户 ID 和消息本身。整个对话显示在这段代码中:

// Get all conversations started by the user that is signed in 
<cfquery name = "Friendship" datasource = "#DSN#">
    SELECT *
    FROM  `conversations`
    WHERE  `user_one` LIKE  '#user.id#'
    ORDER BY  `conversations`.`lastmessage` DESC
</cfquery>

// Get all conversations started by others but receiver is the user that is signed  in                                                                                  
<cfquery name = "FriendshipBack" datasource = "#DSN#">
    SELECT *
    FROM  `conversations`
    WHERE  `user_two` LIKE  <cfqueryparam value="#user.id#" cfsqltype="cf_sql_integer">
    ORDER BY  `conversations`.`lastmessage` DESC
</cfquery>


// OUTPUT - conversations that I began
<cfoutput query="Friendship">
    // This code translates a user id into a name
    <cfquery name = "FriendshipToUsername" datasource = "#DSN#">
        SELECT *
        FROM users
        WHERE id = '#user_two#'
    </cfquery>

    <cfif IsDefined("FriendshipToUsername.username")>
        <cfif IsDefined('URL.chat') and URL.chat neq "">
        </cfif>                

       // Display username 
      <h3>#FriendshipToUsername.username#</h3>
    </cfif>

</cfoutput>

/// OUTPUT - conversations that I received
<cfoutput query="FriendshipBack">
    // This query translates a user id into a name
    <cfquery name = "FriendshipToUsernameBack" datasource = "#DSN#">
        SELECT *
        FROM users
        WHERE id = <cfqueryparam value="#user_one#" cfsqltype="cf_sql_integer">
    </cfquery>

    <cfif IsDefined('URL.chat') and URL.chat neq "">
    </cfif>                
    // Display username 

    <h3>#FriendshipToUsernameBack.username</h3>
</cfoutput>

此时聊天列表分为两类:一类是登录用户开始对话的列表,另一类是登录用户收到其他人的对话的列表。问题是,我不希望它以这种方式显示,所以我想将两个列表混合在一起并根据时间戳(从最新到最旧)列出它们

此时聊天列表分为两类:一类是登录用户开始对话的列表,另一类是登录用户收到其他人的对话的列表。问题是,我不希望它以这种方式显示,所以我想将两个列表混合在一起并根据时间戳(从最新到最旧)列出它们

有什么办法可以做到这一点?

我知道我的代码是可利用的,但这仍然是 WIP

4

2 回答 2

1

此时聊天列表分为两类:一类是登录用户开始对话的列表,另一类是登录用户收到其他人的对话的列表。

然后只需查询其中任何一个条件为真的表,并按时间戳对记录进行排序。(另外,正如另一个线程所提到的,在搜索完全匹配时,正确的运算符是等于,即=,不是LIKE)。

  ...
  WHERE  conversations.user_one = <cfqueryparam value="#user.id#" 
                                           cfsqltype="cf_sql_integer">
  OR     conversations.user_two = <cfqueryparam value="#user.id#" 
                                           cfsqltype="cf_sql_integer">
  ORDER BY  conversations.lastmessage DESC

此代码将用户 ID 转换为名称

如果可以避免,请不要在循环内查询。它增加了很多不必要的开销。检索相关列的正确方法是将 a 添加JOIN到您的查询中。user由于您必须多次加入表(以获取两个名称),因此请使用 analias来区分:

  SELECT conversations.user_one
         , conversations.user_two
         , u1.username AS userNameOne
         , u2.username AS userNameTwo
         , ... 
  FROM   conversations 
            JOIN users u1 INNER JOIN u1.id = conversations.user_one
            JOIN users u2 INNER JOIN u2.id = conversations.user_two
  WHERE  ...
于 2013-04-13T19:14:17.560 回答
1

如果您运行一个联合所有查询而不是两个单独的查询,您将能够这样做。

于 2013-04-13T19:00:26.360 回答