gpt4 book ai didi

mysql - Yii1 中关系的复杂过滤

转载 作者:行者123 更新时间:2023-11-29 12:05:59 31 4
gpt4 key购买 nike

目前我遇到了一个无法优雅解决的问题。给出的是这个(简化的)数据库设计

Simplified ER-Diagram

每个视频都有许多统计数据。到目前为止,它是一个正常的 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

SQL Fiddle

这很简单(因为我只查询一个视频。在我完成的解决方案中,我想将其理解为所有或多个视频)。

  • 最里面的查询:获取给定视频的所有统计信息,按结束日期降序排列(因为我只想要视频的最新统计信息)。
  • 内部查询:按 video_id 和 metric_id 对之前抓取的统计数据进行分组,因为我希望视频的每个统计数据仅获取一次
  • 外部查询:将过滤后的统计数据与实际视频结合起来。
<小时/>

因此,该关系需要一些非常复杂的过滤。我仍然想利用 Yii 的 Active Record 和 Eager Load 全部功能。

有什么方法可以“ Hook ”关系加入过程(就像更现代的框架所做的那样),或者有什么我可以在这里简化但我忽略了的东西吗?

最佳答案

如果您正确设置了关系,gii 会自动执行此操作,那么您可以执行以下操作;

$stats = Stat::model()->findAllByAttributes(array('video_id' => 1), array('order' => 'end DESC'));

访问记录和父表记录

foreach $stat as $stats {
$stat->start;
$stat->end;
// Parent table records can be accessed like so
$stat->video->name
}

关于mysql - Yii1 中关系的复杂过滤,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31475062/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com