MySQL:从联接表中获取每个最新条目

时间:2018-08-10 08:49:57

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

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

一个Item有很多ItemsCheckTypes

  • Item必须每2年在车库检查一次Car1,并每年目视一次
  • Item Car2只需要在车库检查
  • Item完全不需要检查Bike2。

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

  • 2018年1月1日的Check中有CheckType个“车库检查”,检查了Car1和Car2(ItemsChecks进行了分配)

我现在要查询的是找出上次的信息,已经检查了Item中的{strong>每个。 预期的结果是这样的:

ItemsCheckTypes

我尝试了许多JOINS,子查询和其他方法,试图找出哪个表是我的起点(我在考虑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 ItemsChecks)-但现在我只是不知道知道是否有可能,或者我应该执行以下一项操作来(希望)简化它:

  • 创建某种类型的缓存/帮助表,用于存储最后一张支票的id,日期和type_id-如果日期大于当前的最后日期,则新的支票赋值会被覆盖(可能是新的错误来源)
  • 提出更好的数据库设计
  • 对每个项目进行新查询(我认为这可能会更容易,但不会让我选择要尽快检查的所有项目)

在应用程序级别,我正在使用CakePHP 3.x,但我怀疑Cake-solution比SQL-solution更容易。 模型关联看起来不错,其他所有功能都按预期运行。

最后是SQL小提琴:http://sqlfiddle.com/#!9/b3d1f8/17

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

1 个答案:

答案 0 :(得分: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仍然丢失。因此,我们采用了先前的选择,并将其与表checks结合在一起以获取它。

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
;