【问题标题】:Complex Filtering of Relations in Yii1Yii1中关系的复杂过滤
【发布时间】:2015-07-17 11:44:17
【问题描述】:

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

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

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

  • 最内层查询: 获取按end 日期降序排列的给定视频的所有统计信息(因为我只需要视频的最新统计信息)。
  • 内部查询:将之前抓取的统计信息按 video_id 和 metric_id 分组,因为我希望视频的每个统计信息只获取一次
  • 外部查询:将过滤后的统计信息与实际视频相结合。

因此,该关系需要进行一些非常复杂的过滤。我仍然想充分利用 Yii 的 Active Record 和 Eager Load。

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

【问题讨论】:

    标签: mysql activerecord yii yii-relations


    【解决方案1】:

    如果您的关系设置正确,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         
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-11-06
      • 1970-01-01
      • 2018-07-18
      • 1970-01-01
      • 1970-01-01
      • 2013-01-29
      • 2011-04-21
      • 2021-11-10
      相关资源
      最近更新 更多