即时消息系统就像facebook消息部分一样。我想在哪里显示用户和他的朋友之间的对话列表。 我的聊天表的字段是
id,user1(varchar),user2(varchar),message,created_at(timestamp),updated_at(timestamp)
使用查询检索某个对话
SELECT message FROM chat WHERE user1 IN ('"+user1+"','"+user2+"') AND user2 IN ('"+user1+"','"+user2+"')
但是现在我无法检索邮件的最新(最近插入的)行,另一个用户(接收我们的邮件的那个)和发送的时间。这将由列表显示(就像Facebook会话列表)。 这意味着我想要聊天桌上每个用户的最新消息列表(一个)。或者如果我和你聊天,我想收到你的名字和信息。
我想出了一个查询,我希望你能看到它不是我想要的最终答案,但它非常接近它。
SELECT sent_at,message,user1,user2 FROM (SELECT max(created_at) AS
sent_at,message,user1,user2 FROM chats WHERE user1='Tiffany' OR
user2='Tiffany' Group By user1, user2 Having max(created_at)) tb1
它返回用户“Tiffany”的最后一个对话。已经完成,这意味着蒂芙尼发送和接收的最新消息。现在我想收到蒂芙尼收到或发送的最新对话。
答案 0 :(得分:1)
SELECT message FROM chat WHERE user1 IN('" + user1 +"','" + user2 +"' )AND user2 IN('" + user1 +"''" + user2 +"')按消息desc限制排序1;
答案 1 :(得分:1)
我认为这会起作用
ToList()
答案 2 :(得分:1)
如果我正确理解了您的问题,那么您要查找的是会员联系人列表中每个联系人的最新消息(一个)列表?
因此,您需要从数据库中为每个对应方抓取一条消息,并且您获取的消息需要是最新的。
这两个标准现在意味着您/我们可以将逻辑应用于SQL以实现此结果。
因此;
使用您提供的SQL表格列格式:
ID,用户1(VARCHAR),用户2(VARCHAR),消息的updated_at(时间戳),的updated_at(时间戳)
假设您要列出其邮件的成员位于user1
列中,我们可以构建:
SELECT message, FROM_UNIXTIME(MAX(updated_at)) AS chat_time
FROM chat WHERE user1 = :username ORDER BY updated_at GROUP BY user2
因此,user2的foreach值SQL列出了最大时间戳值,这是该用户的最新消息。
我想要做的是,如果用户在 user1
或user2
到GROUP BY
相对列中有特色,那么如果用户在user1然后按用户2分组,反之亦然,但我现在不能轻易做到这一点,可能会涉及HAVING
我没有和我一样多的经验39;喜欢。
可能UNION
会这样做,但我想在这里找到一个更简洁的解决方案:
SELECT message, FROM_UNIXTIME(MAX(updated_at)) AS chat_time
FROM chat WHERE user1 = :username ORDER BY updated_at GROUP BY user2
UNION
SELECT message, FROM_UNIXTIME(MAX(updated_at)) AS chat_time
FROM chat WHERE user2 = :username ORDER BY updated_at GROUP BY user1
答案 3 :(得分:1)
我得到了我想要使用MAX()来获得正确的对话。
SELECT sent_at,
message,
user1,
user2
FROM
(SELECT max(created_at) AS sent_at,
message,
user1,
user2
FROM `chats`
WHERE user1='Tiffany'
OR user2='Tiffany'
Group By user1,
user2
Having max(created_at))tb1