【问题标题】:How to SELECT MySQL 1-to-LAST on 1-to-Many Relationship如何在一对多关系上选择 MySQL 1-to-LAST
【发布时间】:2012-08-07 14:14:04
【问题描述】:

我有 2 个表 -- 表 1 是主文件,表 2 是活动文件。

关系是一对多。

我正在生成一份报告,而我想要返回的只是每个主文件行都连接到相关主 ID 的最后一个活动行。

我不确定如何请求最后一个活动行。我下面的代码返回每个活动行(理所当然)。

感谢您的帮助。

    SELECT *
    FROM master_file AS master
    INNER JOIN activity_file AS activity ON activity.id = master.id
    ORDER BY master.display_name

活动文件有一个名为entry_date 的列。它是记录每个活动的日期和时间戳。我只是想选择最后一个entry_date

例如:

表 2 - 活动如下所示

ID ACTIVITY ENTRY_DATE
1 Update 2012-08-01 09:00:00
1 Edit 2012-08-01 13:45:15
3 Create 2012-07-15 10:09:52
3 Delete 2012-07-22 23:02:00
3 Add 2012-08-05 04:33:00
4 Edit 2012-08-03 15:12:00

【问题讨论】:

  • 你如何定义“最后一个活动行”
  • 感谢@BrandonS -- 请参阅我的问题附录
  • entry_date 对于id 是否唯一,如果不是,如果最后一个以上会发生什么情况?
  • 见@ConradFrix上面的附录

标签: mysql one-to-many greatest-n-per-group one-to-one


【解决方案1】:

解决此问题的一种标准方法是创建一个内联视图,用于查找每个 ID 的最后一个 entry_date。

SELECT *
    FROM master_file AS master
    LEFT JOIN activity_file AS activity ON activity.id = master.id
    LEFT JOIN (select id , max(entry_date) entry_date
                From activity_file 
                group by id) last_activity
    ON activity_file.id = last_activity.id
      and  activity_file.entry_date= last_activity.entry_date

    ORDER BY master.display_name

这种方法的一个问题是,对于给定的 id,您可能有多个带有 max(entry_date) 的记录。您要么需要让您的业务规则处理此问题(例如,只需为该案例显示多个记录),要么您需要找出一个决胜局。你最不想做的就是让它变得不确定

【讨论】:

  • 感谢@ConradFrix。我没有预见到问题,因为活动条目都带有日期和时间标记。因此,对于同一个 id,几乎不可能有 2 个相同的日期时间值。
  • 完美运行。谢谢@ConradFrix
  • 我有一个问题@ConfradFrix ... 有没有办法调整查询语句以列出所有 master_file 行,即使没有相应的活动行?一些主行根本没有任何活动,因此我只得到有活动的主行的报告。谢谢。
  • @Dr.DOT 只需将其更改为 LEFT JOIN(我已更新答案以反映这一点)
  • 嗯,这也带回了所有活动记录以及@ConradFrix。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-03-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多