【问题标题】:Get last message form chat system获取最后一条消息表单聊天系统
【发布时间】:2015-05-30 09:17:30
【问题描述】:

我的问题是我正在尝试创建一个聊天消息系统,

这是我目前所拥有的。

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

小提琴来了 http://sqlfiddle.com/#!9/4d1ab/1

有没有办法获取此群聊中的最后一条消息并确定它的成员是谁?

预期的结果应该是这样的

如果用户 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

希望现在有意义。

【问题讨论】:

  • 为了清楚起见,你能提供想要的结果吗?
  • 感谢您的评论,结果必须是这样的 chat_id |最后写到此聊天的成员 |此聊天中的最后一条消息,1 |亚历克斯 | 1 |测试信息 1 2 |约翰 | 2 |测试信息 2 3 |亚历克斯 | 1 | 123 我不知道模式是否正常,我只是发明了它,我认为我可以在 chat_message -> chat_id 中添加另一个键,这样我就可以在那里拥有聊天 id,然后用一个左连接来获取它,但是我想知道是否有办法在不添加另一个键的情况下获得它,提前谢谢,如果我的英语不太好,对不起。
  • 请相应地编辑您的问题。
  • 我对您的架构感到困惑,无法提供答案,但足以说明 SQL 中没有问题适合接受的答案。
  • 嗨@Alex,我的回答有一些改进,我为你的问题找到了比我提供给你的第一个更好的解决方案:) 所以我认为你应该检查一下。

标签: jquery mysql chat messages


【解决方案1】:

好的,我希望这是我要在这里做的最后一次编辑是你如何做你想做的事一开始我并没有完全理解你的问题,但在你最后一次编辑的时候,这就是解决方案:

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 http://sqlfiddle.com/#!9/d7443/9/0 来测试它(这是你的小提琴,只是为了测试查询而稍作编辑)GL

编辑:

您好,我不得不再次改进我的答案。感谢 Strawberry 的提示和建议让我找到了更好的解决方案...(您可以在此答案下方的 cmets 中看到我们的小讨论)...

这是一个手册链接,一切从这里开始https://dev.mysql.com/doc/refman/5.1/en/example-maximum-column-group-row.html

首先是相关子查询的代码:

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 Fiddle:http://sqlfiddle.com/#!9/d7443/17/0

这是基于 JOIN 的第二种解决方案的代码:

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

这是一个小提琴:http://sqlfiddle.com/#!9/d7443/43/0

此答案的改进再次归功于 Strawberry,他们向我展示了解决此类问题的更好方法。再次感谢!

附:对不起,我更新晚了,我还有一些其他的想法要做,但总比没有好。 :) 总账

【讨论】:

  • 10 次中有 9 次,如果你发现自己有一个 GROUP BY 子句并且没有聚合函数,你可以打赌有些事情已经非常非常错误了。
  • @Strawberry 谢谢你的建议,我会记住的,但我只是想提供帮助,这是我如何才能为这个问题获得预期结果的第一个想法......我想尝试解决它以不同(更好)的方式......我应该从哪里开始有什么建议吗?
  • 手册是一个很好的起点。 dev.mysql.com/doc/refman/5.1/en/…
  • @Strawberry 这样的东西更容易接受sqlfiddle.com/#!9/d7443/17/0 :)
  • 我认为这是相关子查询。我在子查询中有 m2c.chat_id,这是对外部查询中 member_to_chat 表的引用
猜你喜欢
  • 2018-10-09
  • 1970-01-01
  • 2022-10-26
  • 2015-12-28
  • 2019-03-23
  • 1970-01-01
  • 2013-02-02
  • 2020-01-16
  • 1970-01-01
相关资源
最近更新 更多