【问题标题】:MySql messaging system query fetch one message per conversationMySql 消息系统查询每个对话获取一条消息
【发布时间】:2013-01-18 11:29:03
【问题描述】:

我有这 3 张桌子:

messages:
id  conv    snd text    created
1   1   1   asdasd      2012-12-15 23:10:53
3   1   1   zzz         2013-01-18 12:37:44
4   1   1   ssss        2013-01-18 12:42:01


msg_status
id  msg user    status
1   1   1       mine
2   1   4       unread
3   3   1       mine
4   3   4       unread
5   4   1       mine
6   4   4       unread


conv_users
conv    user
1       1
1       4
2       1
2       4
2       5

这是我网站中的一个消息系统,除了这个小查询,我已经准备好了, 假设通过对话中的最后一条消息获取所有用户对话。

也就是说,如果用户 A 有 2 个对话,并且在 conv1 中有 10 条消息,而在 conv2 中只有 2 条消息,他将得到两行:convId、messageId、messageText、messageDate 等。

但问题是该消息应该是每次对话中的最后一条。

这是我已经完成的查询,但它不起作用!

SELECT
  cu.conv,
  msg.snd,
  msg.text,
  mst.status,
  msg.created
FROM conv_users AS cu
  INNER JOIN messages AS msg
    ON cu.conv = msg.conv
  INNER JOIN msg_status AS mst
    ON msg.id = mst.msg
WHERE cu.user = 4
    AND mst.user = 4
ORDER BY msg.created DESC

如果我添加 GROUP BY cu.conv 它会显示第一条消息,而不是我想要的最后一条消息。

【问题讨论】:

  • 尝试阅读一些最近的主题。这个问题每隔六七分钟就会被问一次。
  • 我认为您的表中缺少关系,请查看表messages,您如何知道特定消息来自conv 1,1 或来自1,4

标签: php mysql sql


【解决方案1】:

尝试使用带最大值的派生查询

SELECT
  cu.conv,
  msg.snd,
  msg.text,
  mst.status,
  msg.created
FROM conv_users AS cu
  INNER JOIN (SELECT MAX(id), conv FROM messages GROUP BY conv )messages AS msg ON cu.conv = msg.conv
  INNER JOIN (SELECT MAX(id) , msg FROM msg_status GROUP BY msg) AS mst ON msg.id = mst.msg 
WHERE cu.user = 4
    AND mst.user = 4
ORDER BY msg.created DESC

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-01-19
    • 1970-01-01
    • 2013-08-13
    • 2016-03-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多