【问题标题】:MySQL: get each latest entry from joined tableMySQL:从连接表中获取每个最新条目
【发布时间】:2019-01-17 20:04:29
【问题描述】:

我正在尝试为 Items 构建一个数据库(下面的 SQLFiddle)(让它们是任何类型的机器,在本例中是汽车和自行车),可能必须在针对一个或多个CheckTypes 的给定间隔。

一个Item 有很多ItemsCheckTypes

  • Item Car1 必须每 2 年在车库检查一次,并且每年都要目视检查一次
  • Item Car2 只需在车库检查即可
  • Item Bike2 根本不需要检查。

一个Check属于一个CheckType,并且有很多ItemsChecks

  • Check 于 2018 年 1 月 1 日与CheckType“车库检查”,检查了 Car1 和 Car2(ItemsChecks 完成任务)

我现在想要的是查询上一次Item 已被检查每个ItemsCheckTypes。 预期是这样的结果:

Items.id | CheckTypes.id | LAST CHECK.date | LAST CHECK.id
1        | 1             | 2018-01-01      | 4
1        | 2             | 2017-08-01      | 3
2        | 1             | 2016-01-01      | 1

我尝试了许多 JOINS、子查询和其他方法,试图找出哪个表是我的起点(我在想 ItemsChecksItems) - 但现在我只是不知道是不是完全有可能,或者我应该执行以下操作之一来(希望)简化它:

  • 创建某种缓存/辅助表,用于存储最后一次检查的 id、日期和 type_id - 如果日期大于当前的最后日期,则在新的检查分配上被覆盖(可能是新的错误来源)李>
  • 提出更好的数据库设计
  • 对每个项目进行新的查询(我认为这可能更容易,但不会让我选择查找所有必须尽快检查的项目)

在应用程序级别我使用的是 CakePHP 3.x,但我怀疑 Cake 解决方案会比 SQL 解决方案更容易。 模型关联似乎很好,其他一切都按预期工作。

最后是 SQL-Fiddle:http://sqlfiddle.com/#!9/b3d1f8/17

感谢任何帮助或建议,我不知道该走哪条路......

【问题讨论】:

  • 抱歉,我理解第 (1 | 2 | 2017-08-01 | 3) 行的结果。
  • Item #1 last Check for CheckType #2 is at 2017-08-01, Check #3

标签: mysql join cakephp-3.0 greatest-n-per-group


【解决方案1】:

将支票按item_idcheck_type_id 分组并获取最新日期:

select
    ic.item_id, 
    c.check_type_id, 
    max(c.date) latest
from items_checks ic
inner join checks c on c.id = ic.check_id
group by 
    ic.item_id, 
    c.check_type_id
;

check_id 仍然丢失。所以我们把前面的select和表checksjoin起来就可以得到了。

select
    c2.item_id,
    c2.check_type_id,
    c2.latest last_check,
    c1.id check_id
from checks c1
inner join (
    select ic.item_id, c.check_type_id, max(c.date) latest
    from items_checks ic
    inner join checks c on c.id = ic.check_id
    group by ic.item_id, c.check_type_id
) c2 on c2.check_type_id = c1.check_type_id and c2.latest = c1.date
order by
    c2.item_id,
    c2.check_type_id
;

【讨论】:

  • 好吧,我印象深刻。给我一点时间来弄清楚这个魔法,但这似乎是我永远找不到的答案。
  • @nappo check_id 在第一次选择时无法选择,因为它没有分组,也没有聚合。所以我们需要与checks 表进行连接以获得check_id。 - 所以如果这是你一直在寻找的,请你接受我的回答。谢谢。
猜你喜欢
  • 2010-12-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-02-22
  • 2014-06-29
  • 2020-03-31
  • 2014-06-27
  • 1970-01-01
相关资源
最近更新 更多