我正在尝试为Items
构建一个数据库(下面的SQLFiddle)(让它们成为任何类型的机器,在此示例中为汽车和自行车),必须检查 在给定的时间间隔内针对一个或多个CheckTypes
。
一个Item
有很多ItemsCheckTypes
:
Item
必须每2年在车库检查一次Car1,并每年目视一次Item
Car2只需要在车库检查Item
完全不需要检查Bike2。一个Check
属于一个CheckType
,并且有许多ItemsChecks
:
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
)-但现在我只是不知道知道是否有可能,或者我应该执行以下一项操作来(希望)简化它:
在应用程序级别,我正在使用CakePHP 3.x,但我怀疑Cake-solution比SQL-solution更容易。 模型关联看起来不错,其他所有功能都按预期运行。
最后是SQL小提琴:http://sqlfiddle.com/#!9/b3d1f8/17
感谢任何帮助或建议,我不知道该走哪条路...
答案 0 :(得分:1)
按item_id
和check_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
;