Jquery 从聊天系统获取最后一条消息
我的问题是我正在尝试创建一个聊天信息系统 这就是我目前所拥有的Jquery 从聊天系统获取最后一条消息,jquery,mysql,chat,messages,Jquery,Mysql,Chat,Messages,我的问题是我正在尝试创建一个聊天信息系统 这就是我目前所拥有的 Chat chat_id | member_id | added Member to Chat member_to_chat_id | member_id | chat_id Chat Message chat_message_id | member_to_chat_id | message | added 所以我想得到所有会员参与的聊天。我是这样做的 Select c.chat_id From member_to_chat
Chat
chat_id | member_id | added
Member to Chat
member_to_chat_id | member_id | chat_id
Chat Message
chat_message_id | member_to_chat_id | message | added
所以我想得到所有会员参与的聊天。我是这样做的
Select c.chat_id
From member_to_chat m2c
Left Join chat c ON c.chat_id = m2c.chat_id WHERE m2c.member_id = 1
GROUP by c.chat_id
提琴来了
有没有办法获取此群聊中的最后一条消息并确定它是谁的成员
预期结果应该是这样的
如果用户Alex在两次聊天中,并且他写了最后一条消息
chat_id | member_name | member_message
1 Alex Test1
2 Alex Test2
稍后,如果其他人在聊天中添加id为1的消息,我们仍然会收到用户id为1:Alex的所有聊天,但该消息应该来自其他成员,因此类似这样的事情:
chat_id | member_name | member_message
1 John Last Test1
2 Alex Test2
希望这现在有意义。好的,我希望这是我要做的最后一次编辑这里是你如何做你想做的事情我一开始并不完全理解你的问题,但通过你的最后一次编辑,我认为这是解决方案:
SELECT * FROM(
SELECT m2c.chat_id, m.name, cm.message
FROM member_to_chat m2c
INNER JOIN chat_message cm
ON m2c.member_to_chat_id = cm.member_to_chat_id
INNER JOIN members m
ON m2c.member_id = m.member_id
WHERE m2c.chat_id IN (SELECT c.chat_id
FROM member_to_chat m2c
INNER JOIN chat c ON c.chat_id = m2c.chat_id
WHERE m2c.member_id = 2)
ORDER BY cm.chat_message_id DESC) resultTable
GROUP BY chat_id
这里是测试它的Fiddle(这是您的Fiddle,只需稍加编辑即可测试查询)GL
编辑:
你好,我必须再次改进我的答案。感谢草莓的提示和建议,让我找到了解决此问题的更好方法。。。(你可以在这个答案下面的评论中看到我们的小讨论)
这里有一个手册链接,所有内容都从这里开始
首先,这里是相关子查询的代码:
SELECT m2c.chat_id, m.name, cm.message
FROM member_to_chat m2c
INNER JOIN chat_message cm
ON m2c.member_to_chat_id = cm.member_to_chat_id
INNER JOIN members m
ON m2c.member_id = m.member_id
WHERE m2c.chat_id IN (SELECT c.chat_id
FROM member_to_chat m2c
INNER JOIN chat c ON c.chat_id = m2c.chat_id
WHERE m2c.member_id = 2)
AND cm.chat_message_id = (SELECT MAX(cmm.chat_message_id)
FROM chat_message cmm
INNER JOIN member_to_chat m2cm
on m2cm.member_to_chat_id = cmm.member_to_chat_id
WHERE m2c.chat_id = m2cm.chat_id)
下面是SQL FIDLE:
下面是基于连接的第二个解决方案的代码:
SELECT t1.chat_id, name, message FROM (
SELECT m2c.chat_id, m.name, cm.message, cm.chat_message_id
FROM member_to_chat m2c
INNER JOIN chat_message cm
ON m2c.member_to_chat_id = cm.member_to_chat_id
INNER JOIN members m
ON m2c.member_id = m.member_id
WHERE m2c.chat_id IN (SELECT c.chat_id
FROM member_to_chat m2c
INNER JOIN chat c ON c.chat_id = m2c.chat_id
WHERE m2c.member_id = 2)) AS t1
JOIN (SELECT m2c.chat_id, MAX(cm.chat_message_id) as maxChatId
FROM chat_message cm
INNER JOIN member_to_chat m2c
ON m2c.member_to_chat_id = cm.member_to_chat_id
GROUP BY chat_id) AS t2
ON t1.chat_id = t2.chat_id
AND t1.chat_message_id = t2.maxChatId
这里有一把小提琴:
这个答案的改进再次归功于草莓,他们给了我一个更好的方法来解决这样的问题。再次感谢
顺便说一句,很抱歉我更新得太晚了,我还有其他一些想法要做,但总比没有好。:)GL为了清楚起见,你能提供想要的结果吗?谢谢你的评论,结果必须像这个聊天室| id |最后一次写信给这个聊天室的成员|这个聊天室的最后一条消息,1 | Alex | 1 | Test message 12 | John | 2 | Test message 23 | Alex | 1 | 123 |我不知道这个模式是否正常,我只是发明了它,我想我可以在chat_message->chat_id中添加另一个键,这样我就可以在那里拥有聊天id,在这之后,只需加入一个左键就可以获得它,但是我想知道是否有一种方法不需要添加另一个键,提前谢谢,如果我的英语不是很好,很抱歉。请相应地编辑你的问题。我对你的模式很困惑,无法提供答案,但足以说明SQL中没有问题,接受的答案是合适的。嗨@Alex,有一些问题改进我的答案,我找到了比我给你的第一个更好的解决方案:)所以我想你应该检查一下。10次中有9次,如果你发现自己有一个GROUP BY子句,没有聚合函数,你可以打赌一定出了非常非常大的问题。@草莓谢谢你的建议我会记住的,但我只是想帮忙,这是我第一次想到如何才能得到这个问题想要的结果。。。我想尝试用不同(更好)的方式解决它。。。有什么建议我应该从哪里开始吗?手册将是一个很好的开始@草莓是这样更容易接受的:)我认为这是相关子查询。我在子查询中有m2c.chat\u id,它是对外部查询中的member\u to\u chat table的引用