使用GROUP BY获取最新条目

Pat*_*eck 7 php mysql sql codeigniter

我正在从我的数据库中提取一些对话.它们按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
Run Code Online (Sandbox Code Playgroud)

邮件表

在此输入图像描述

用户表(片段)

在此输入图像描述

这是当前的工作代码.所述SecretAgent发送的消息更新的邮件从该机构,它应当表示代替 在此输入图像描述

Mic*_*ski 4

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

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

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

\n