【问题标题】:Get latest entry using GROUP BY使用 GROUP BY 获取最新条目
【发布时间】:2013-01-07 00:57:11
【问题描述】:

我正在从我的数据库中提取一些对话。它们按 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

邮件表

用户表(sn-p)

这是当前的工作代码。 SecretAgent 发送了比 来自该机构的邮件更新的消息,它应该显示该消息

【问题讨论】:

  • @xQbert 为什么?,最新消息是日期最长的消息
  • 猜那个邮件是ID,你为什么不通过mail.id desc订购?或者是从不同地方插入的电子邮件,更高的 id 不一定是最新的电子邮件?
  • 那不行,它仍然选择最旧的一个
  • @MichaelBerkowski 感谢此评论:“这可能(可能)仍会产生不可靠的结果。MySQL 允许 SELECT 中的列不在 GROUP BY 中,通常会导致其他列的值不确定"
  • 请发布您的表架构。需要更多信息才能正确执行此操作。

标签: php mysql sql codeigniter


【解决方案1】:

不幸的是,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'

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

【讨论】:

  • 这似乎在 PHPMyAdmin 中运行时有效。现在我将深入研究 CodeIgniter 文档,看看如何使用 Active Records 完成这项工作。谢谢! :-)
  • @njk 只是希望保持活跃 - 我不再回答太多了。有些人似乎已经在 100k 时“退休”了。我可能还有 3 天...
  • @MichaelBerkowski 所以退休派对?
  • @njk 当我还是 achingly close to the top 100 的时候不会。也许那时我会躲起来并巨魔元。
猜你喜欢
  • 1970-01-01
  • 2017-09-03
  • 2020-08-11
  • 2022-10-06
  • 2020-12-19
  • 2021-01-20
  • 1970-01-01
  • 1970-01-01
  • 2013-06-27
相关资源
最近更新 更多