2013-01-23 66 views
7

我从数据库中提取一些对话。它们按user_from列进行分组。使用GROUP BY获取最新条目

截止目前,它输出最旧的消息。我想让它显示最新的消息。

这样做最简单的方法是什么?

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 

邮件表

enter image description here

用户表(片断)

enter image description here

这是当前的工作代码。该SecretAgent发送消息不是从机构邮件,它应该显示而不是 enter image description here

+4

@xQbert为什么?,最新的消息是最大的日期 – Lamak

+0

推测邮件为ID,为什么不通过'mail.id desc'命令?或者是从不同地方插入的电子邮件,并且较高的ID不需要最新的电子邮件? – SERPRO

+0

这不会做到这一点,它仍然选择*最古老*一 –

回答

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' 

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

+0

这似乎在PHPMyAdmin中运行它时工作。现在我将深入探讨CodeIgniter文档,并了解如何使用Active Records完成这项工作。谢谢! :-) –

+0

+1 *不幸*。举行派对庆祝10万? – Kermit

+0

@njk只是希望保持活跃 - 我不再回答太多。一些似乎已经在10万年“退休”。我也许3天后... –