我正在与几个对话建立聊天,并且有一项任务是从每个对话中提取最新消息。
通过对话我的意思是来自特定用户的消息。 (它由fromid
或toid
列定义。
我的计划:
1)提取对话的ID
2)自己提取消息
基于此处类似问题的答案,我构建了无法执行的查询(“您的SQL语法出错;请查看与您的MySQL服务器版本对应的手册,以便在'WHERE {附近使用正确的语法{1}}!= 4 LIMIT 10)table2 ON(table2.VALIDID =`support_chat_message'在第1行“)
我的查询是
fromid
一些解释:
1)我选择SELECT `fromid`, `toid`, `message`, `sendat`, `messageid`
FROM `support_chat_messages` INNER JOIN
(SELECT `fromid` as VALIDID
FROM `support_chat_messages`
GROUP BY `fromid`
WHERE `fromid` != 4 LIMIT 10) table2
ON (table2.VALIDID = `support_chat_messages`.`fromid`)
OR (table2.VALIDID = `support_chat_messages`.`toid`) ORDER BY `messageid`
并通过相同的字段对它们进行分组以获得对话(=用户ID)。用户标识名为VALIDID
2)fromid
!= 4表示不是来自我的邮件(只有其他用户ID)。
3)限制10 - 不超过10次对话。
4)我在表support_chat_messages中搜索从所选用户(fromid
)或所选用户(table2.VALIDID = support_chat_messages.fromid
)发送的消息
查询有什么问题?
如何限制查询?我需要从每个对话中获取最新消息。如果我将限制1放在最后,我会得到最新的对话,但不是每个对话。
你知道如何优化吗?我将每2秒刷新一次,这样的查询会严重加载系统。我有一个想法,即在没有连接的情况下使用groupby(fromid或toid),但不确定这样的表达式是否有效。
感谢您的帮助。
这是一个相同的小提琴。 sqlfiddle.com /#!2 / 796c4 / 4/0
期望的结果会是这样......
对话是(7和4),(6和4),(5和4),(2和4)对于每个顶部消息是(22),(21),(20),(18)
答案 0 :(得分:1)
SELECT x.*
FROM support_chat_messages x
JOIN
( SELECT fromid
, MAX(sendat) max_sendat
FROM support_chat_messages
WHERE fromid != 4
GROUP
BY fromid
) y
ON y.fromid = x.fromid
AND y.max_sendat = x.sendat;