Laravel雄辩 - 使用WhereIn函数

时间:2016-03-11 21:18:30

标签: php laravel eloquent laravel-5.1

我目前有一个功能:

Score::whereIn('site_id', $sites)
      ->where('type', 1)
      ->avg('score');

但目前,正如您所看到的,它在Scores表中的所有结果中取平均值。我想只对每个$site_id的最新行进行平均(尽管表中可能没有所有$ site_id')。

该表格有一个created_at列,它将根据日期/时间确定哪一个是最新的。

3 个答案:

答案 0 :(得分:0)

使用orderBy('created_at', 'DESC')并使用take(15)限制结果。这将占据您表中最近的15条记录。

Score::whereIn('site_id', $sites)
      ->where('type', 1)
      ->orderBy('created_at', 'DESC')
      ->take(15)
      ->avg('score');

take()orderBy()上的文档。

答案 1 :(得分:0)

您可以添加groupBy

Score::whereIn('site_id', $sites)
      ->where('type', 1)
      ->orderBy('created_at', 'desc')
      ->groupBy('site_id')
      ->avg('score');

答案 2 :(得分:0)

我不确定使用Laravel的活动记录样式查询构建器有一种简单的方法。

我一直在做这样的事情,它需要一个子查询或临时表,因为GROUP BY(特别是在MySQL中)将遵守ORDER BY AFTER 分组完成,这意味着您无法保证预先分组为分组选择的值是符合您的ORDER BY的值。

在这种情况下,我认为您实际上可能需要2个子查询:第一个用于分组行,第二个用于分组,因此每个site_id有1行,最后选择进行平均。如果您只执行第一个子查询,则最终会得到每个site_id的平均值,而不是所有site_id的平均值。

以下是我认为您正在寻找的示例查询:

SELECT AVG('score') FROM (
    SELECT * FROM (
        SELECT * FROM table_name ORDER BY created_at DESC
    ) AS tbl GROUP BY site_id
) AS tbl2;

这是未经测试的,但我认为这通常是正确的。

......所有这些都假设我已经正确地解释了这个问题,希望我做到了。

我希望我有一个比2个子查询更好的建议 - 如果其他人有更好的方法,我会喜欢学习新的东西。

现在,使用Laravel的活动记录样式查询构建器执行此操作是我必须要查看是否有可能。可能只需要运行原始查询。但我想我会先发布方法,看看它是否在继续深入研究之前是否合理。