不幸的是,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'
编辑更新以显示所有最近的发件人,而不仅仅是一个。