我在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
答案 0 :(得分:1)
如果您运行单个联合所有查询而不是两个单独的查询,您将能够这样做。
答案 1 :(得分: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转换为名称
如果可以避免,请不要在循环内查询。它增加了许多不必要的开销。检索相关列的正确方法是在查询中添加JOIN
。由于您必须多次加入user
表(以获取两个名称),因此请使用alias
来区分:
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 ...