【问题标题】:Mysql : Algorithm to select most recent item per key in a history tableMysql:在历史表中选择每个键的最新项目的算法
【发布时间】:2018-11-08 23:10:39
【问题描述】:

我正面临一个算法问题。 我有一个表,这是一个我没有建立的历史表。该表具有这种结构:

id - 文件 - 评论日期 - 评论 - 作者
1 - 1 - 20180901 - 嗨 - 2
2 - 1 - 20170901 - 你好 - 3
3 - 2 - - -
4 - 2 - 20160504 - 大家好 -4

每个文件都可以有多个 cmets,但我只想为每个文件选择一行并记录最近的评论。

我尝试了一组不同的 group by、have、where、max... 组合,但无法获得预期的结果。

我猜这只是一个技巧,但我不知道......

欢迎任何帮助!

谢谢 文森特

【问题讨论】:

  • 如果您在同一个文件中有两个“最新”的 cmets 且日期相同,应该显示哪一个?任何?他们全部? id值高的那个?
  • @MarcusAdams 每个 cmets 都按日期时间排序,每个 cmets 通常以月份分隔,因此这可能不是问题。周转将是最高 ID,因为评论 ID 会自动递增 :)

标签: mysql


【解决方案1】:

您可以使用排除连接来完成此操作:

SELECT c1.id, c1.file, c1.comment_date, c1.comment, c1.author
FROM comments c1
LEFT JOIN comments c2
ON c2.file = c1.file AND c2.id > c1.id 
WHERE c2.id IS NULL

我使用id 列来确定每个文件的最新行,而不是comment_date 列,因为每个文件可能存在具有重复comment_date 值的行。

如果你必须使用comment_date,那么如果有重复的日期,你可以使用这个回退到id的查询:

SELECT c1.id, c1.file, c1.comment_date, c1.comment, c1.author
FROM comments c1
LEFT JOIN comments c2
ON c2.file = c1.file AND c2.comment_date > c1.comment_date AND c2.id > c1.id 
WHERE c2.id IS NULL

【讨论】:

  • 这对我来说听起来很不错,我会尽快尝试并认为它会有很大帮助。谢谢!
  • 快速反馈:您的建议非常有效,除了因为我正在处理具有非索引公共键的大型数据集,它需要很长时间才能运行。我的转变:我不会在页面加载时执行此操作,而是将其用作数据每日更新的清理请求:创建一个临时表,每个文件仅包含最新评论。再次感谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-12-06
  • 2014-10-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多