【发布时间】:2014-02-07 23:55:59
【问题描述】:
我正在建立一个包含多个对话的聊天,并且我的任务是从每个对话中提取最新消息。
对话是指来自或发往特定用户的消息。 (由fromid 或toid 列定义)。
我的计划:
1) 提取对话ID
2) 自己提取消息
根据此处对类似问题的回答,我构建了无法执行的查询(“您的 SQL 语法有错误;请查看与您的 MySQL 服务器版本相对应的手册,以获取在 'WHERE @ 附近使用的正确语法987654324@ != 4 LIMIT 10) table2 ON (table2.VALIDID = `support_chat_message' at line 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`
一些解释:
1) 我选择fromid 并通过同一字段对它们进行分组以获取对话(=用户 ID)。用户 id 被命名为 VALIDID
2) 其中fromid!= 4 表示不是来自我的消息(只有其他用户 ID)。
3) 限制 10 - 不超过 10 个对话。
4) 我在表 support_chat_messages 中搜索从选定用户 (table2.VALIDID = support_chat_messages.fromid) 或选定用户 (table2.VALIDID = support_chat_messages.toid) 发送的消息
查询有什么问题?
如何限制查询?我需要从每个对话中获取最新消息。如果我把限制 1 放在最后,我只会得到最新的对话,而不是每个对话 1。
你知道如何优化它吗?我将每 2 秒刷新一次,这样的查询将严重加载系统。我有一个想法在没有加入的情况下使用 groupby(fromid 或 toid),但不确定这样的表达式是否有效。
感谢您的帮助。
这是一个相同的小提琴。 sqlfiddle.com/#!2/796c4/4/0
想要的结果是这样的......
对话是(7和4),(6和4),(5和4),(2和4)对于每个顶部消息是(22),(21),(20),(18)
【问题讨论】:
-
需求结果:(fromid, toid, messageid): (7,4,22),(6,4,21),(5,4,20),(2,4,18)
-
对话有 (7 和 4), (6 和 4), (5 和 4), (2 和 4) 对于每个顶部消息是 (22), (21), (20), (18)