目前我遇到了一个我无法优雅地解决的问题。给定的是这个(简化的)数据库设计
每个视频都有许多统计数据。到目前为止,它是一个正常的 1-n 关系,但是有一些限制。
我想获取n 个预先加载了当前统计信息的视频。一个视频一次只有 *n 个当前统计信息,其中 n 是具有相同 video_id 的统计信息的指标数量(不同的metric_id)*
为了实现这一点,我发现唯一可能的解决方案是一个非常复杂的查询,如下所示:
SELECT `end`, `id`, `name`, `metric_id`, `value` FROM `video`
JOIN (
SELECT `start`, `end`, `video_id`, `metric_id`, `value`
FROM (
SELECT `start`, `end`, `video_id`, `metric_id`, `value`
FROM `stat`
WHERE `video_id` = 1
ORDER BY `end` DESC
) stats
GROUP BY `video_id`, `metric_id`
) stats ON stats.video_id = video.id
WHERE `video_id` = 1
这是简化的(因为我只查询一个视频。在我完成的解决方案中,我想将它理解为所有或多个视频)。
- 最内层查询:获取按日期降序排列的给定视频的所有统计信息
end
(因为我只想要视频的最新统计信息)。 - 内部查询:按 video_id 和 metric_id 对先前抓取的统计信息进行分组,因为我希望视频的每个统计信息只获取一次
- 外部查询:将过滤后的统计信息与实际视频相结合。
因此,该关系需要一些非常复杂的过滤。我仍然想利用 Yii 的 Active Record 和 Eager Load 所有这些。
有没有办法“挂钩”到关系 joinig 过程(就像更现代的框架一样),或者有什么我可以在这里简化但我忽略的东西?