7

我正在从我的数据库中提取一些对话。它们按user_from列分组。

截至目前,它输出最旧的消息。我希望它显示最新消息。

最简单的方法是什么?

SELECT *
FROM (`mail`)
JOIN `users` ON `users`.`id` = `mail`.`user_from`
JOIN `users_info` ON `users_info`.`user_id` = `mail`.`user_from`
WHERE `user_to` =  '1'
GROUP BY `user_from`
ORDER BY `mail`.`date` desc

邮件表

在此处输入图像描述

用户表(片段)

在此处输入图像描述

这是当前的工作代码。SecretAgent从该机构发送的消息比Mail更新,而是应该显示 该消息在此处输入图像描述

4

1 回答 1

4

不幸的是,MySQL 对GROUP BY子句的内容非常宽松,这会产生不可靠的结果,除非您将所有列包含在GROUP BY. 从不建议SELECT *在连接查询中使用它,但我们暂时将其保留。您需要做的是执行子查询连接,按日期获取用户的最新消息,并与其余列连接。

SELECT 
  /* Don't actually do this. Be explicit about columns and assign aliases where their names collide */
  users.*,
  users_info.*,
  mail.*
FROM
  `users`
  JOIN `mail` ON `users`.`id` = `mail`.`user_from`
  JOIN `users_info` ON `users_info`.`user_id` = `mail`.`user_from`
  /* Joined subquery gets most recent message from each user */
  JOIN (
    SELECT  user_from, MAX(date) AS date
    FROM mail
    WHERE user_to = '1'
    GROUP BY user_from
    /* Joined back to the main mail table on user_from and date */
  ) most_recent ON mail.user_from = most_recent.user_from AND mail.date = most_recent.date
  WHERE `user_to` =  '1'

编辑更新以显示所有最近的发件人,而不仅仅是一个。

于 2013-01-23T14:19:21.010 回答