0

我正在尝试 - 使用 laravel 4 来获取一个查询,该查询会在给定的时间段内产生一周中每一天的访问者/客户的平均数量,例如星期一、星期二、星期三等。

我可以使用以下查询在 mySql 中执行此操作:

SELECT day_of_week, AVG(visitors_sum) average_order FROM 
(
  SELECT DAYNAME(play_date) day_of_week, 
     DAYOFWEEK(play_date) day_num, 
     TO_DAYS(play_date) `date`,
     sum(group_size) visitors_sum
  FROM reservations 
  GROUP BY `date`
) temp
GROUP BY day_of_week 
ORDER BY day_num

我试着简单地用查询做一个 db::raw 但这不起作用。除此之外,我无法解决这个问题。我首先尝试使用以下方法创建子查询:

$average = DB::table('reservations',
        DB::raw('DAYNAME(play_date) AS day_of_week, 
                 DAYOFWEEK(play_date) AS day_num, 
                 TO_DAYS(play_date) AS playdate,
                 sum(group_size) as visitors_sum)'))
        ->groupBy('day_of_week')
        ->get();

但这提出了一个错误未知列“day_of_week”所以我假设流利的不能支持groupBy中的别名并且可能是sortby?

那么,我怎样才能重新创建这个查询来获得我需要的结果,最好是一次调用?

任何帮助表示赞赏

谢谢

4

2 回答 2

1

Laravel 文档示例可能会更详细一些

这对您的请求来说有点晚了,但如果这仍然对您有帮助,请尝试此操作。我在用 Laravel fluent 解决这个问题时遇到了非常相似的问题。将所有内容滚动到DB::select语句时遇到的一个问题是我无法对结果使用->paginate()方法,因为没有返回对象。此代码将内容保存在 DB 对象中,允许您对结果使用对象方法,例如 ->paginate()、->toJson、->toArray、->toSql等。

下面使用的->from()方法仅在文档页面上的一个晦涩用例中使用过一次,我错过了阅读文档的前 10 次。

我在最后有一个 ->toSql() 来获取我在下面发布的实际 SQL 代码的输出。您可以将其更改为->get()以检索您的数据。

      $average = DB::table('temp')
            ->select(DB::Raw('day_of_week, AVG(visitors_sum) average_order'))
            ->from(DB::Raw('(
                  SELECT DAYNAME(play_date) day_of_week,
                         DAYOFWEEK(play_date) day_num,
                         TO_DAYS(play_date) `date`,
                         sum(group_size) visitors_sum
                  FROM reservations
                  GROUP BY `date`
                ) temp'))
            ->groupBy('temp.day_of_week')
            ->orderBy('temp.day_num')
            ->toSql();

这是 Laravel 4 fluent 从上述代码生成的实际 SQL,在功能上与原始问题中的原始代码几乎相同。

string(457) "select day_of_week, AVG(visitors_sum) average_order from (
                  SELECT DAYNAME(play_date) day_of_week,
                         DAYOFWEEK(play_date) day_num,
                         TO_DAYS(play_date) `date`,
                         sum(group_size) visitors_sum
                  FROM reservations
                  GROUP BY `date`
                ) temp group by `temp`.`day_of_week` order by `temp`.`day_num` asc" 
于 2014-06-27T19:28:40.223 回答
0

是的 - 找到了结果。我过于复杂了,可以使用以下方法获得相同的结果:

$average = DB::select(
        'SELECT day_of_week, 
        AVG(visitors_sum) average_order 
        FROM 
            (
              SELECT DAYNAME(play_date) day_of_week, 
                     DAYOFWEEK(play_date) day_num, 
                     TO_DAYS(play_date) `date`,
                     sum(group_size) visitors_sum
              FROM reservations 
              GROUP BY `date`
            ) temp
        GROUP BY day_of_week 
        ORDER BY day_num');

这让我得到了我需要的结果。我认为Select需要一个表,但可以使用原始查询代替

谢谢

于 2013-10-06T09:13:13.987 回答