MySQL:从加入的 table 中获取每个最新条目
MySQL: get each latest entry from joined table
我正在尝试为 Items
建立一个数据库(下面的SQLFiddle)(可以是任何类型的机器,在这个例子中是汽车和自行车)可能必须在给定的时间间隔内针对一个或多个CheckTypes
进行检查。
一个Item
有多个ItemsCheckTypes
:
Item
Car1 必须每 2 年在车库检查一次,每年目视检查一次
Item
Car2 只需在车库检查
Item
Bike2完全不用托运
一个Check
属于一个CheckType
并且有多个ItemsChecks
:
- A
Check
on 2018-01-01 with CheckType
"Garage inspection", Car1 & Car2 were checked (ItemsChecks
does the assignment)
我现在想要的是找出上次的查询,每个都检查了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、子查询和其他方法,试图弄清楚哪个 table 是我的起点(我正在考虑 ItemsChecks
或 Items
)- 但正确现在我只是不知道这是否可能,或者我是否应该执行以下操作之一来(希望)简化它:
- 创建某种缓存/助手-table 存储上次支票的 ID、日期和 type_id - 如果日期大于当前上次日期(可能是一个新的可能来源关闭错误)
- 提出更好的数据库设计
- 对每个项目进行新查询(我认为这可能更容易,但不会让我选择查找所有必须尽快检查的项目)
在应用程序级别,我使用的是 CakePHP 3.x,但我怀疑 Cake 解决方案是否比 SQL 解决方案更容易。
模型关联看起来很好,其他一切都按预期工作。
最后 SQL-Fiddle: http://sqlfiddle.com/#!9/b3d1f8/17
感谢任何帮助或建议,我不知道该走哪条路...
按 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
仍然不见踪影。所以我们把前面的 select 和 table 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
;
我正在尝试为 Items
建立一个数据库(下面的SQLFiddle)(可以是任何类型的机器,在这个例子中是汽车和自行车)可能必须在给定的时间间隔内针对一个或多个CheckTypes
进行检查。
一个Item
有多个ItemsCheckTypes
:
Item
Car1 必须每 2 年在车库检查一次,每年目视检查一次Item
Car2 只需在车库检查Item
Bike2完全不用托运
一个Check
属于一个CheckType
并且有多个ItemsChecks
:
- A
Check
on 2018-01-01 withCheckType
"Garage inspection", Car1 & Car2 were checked (ItemsChecks
does the assignment)
我现在想要的是找出上次的查询,每个都检查了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、子查询和其他方法,试图弄清楚哪个 table 是我的起点(我正在考虑 ItemsChecks
或 Items
)- 但正确现在我只是不知道这是否可能,或者我是否应该执行以下操作之一来(希望)简化它:
- 创建某种缓存/助手-table 存储上次支票的 ID、日期和 type_id - 如果日期大于当前上次日期(可能是一个新的可能来源关闭错误)
- 提出更好的数据库设计
- 对每个项目进行新查询(我认为这可能更容易,但不会让我选择查找所有必须尽快检查的项目)
在应用程序级别,我使用的是 CakePHP 3.x,但我怀疑 Cake 解决方案是否比 SQL 解决方案更容易。 模型关联看起来很好,其他一切都按预期工作。
最后 SQL-Fiddle: http://sqlfiddle.com/#!9/b3d1f8/17
感谢任何帮助或建议,我不知道该走哪条路...
按 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
仍然不见踪影。所以我们把前面的 select 和 table 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
;