【问题标题】:Laravel Nested Select + MySQLLaravel 嵌套选择 + MySQL
【发布时间】:2019-01-06 14:37:19
【问题描述】:

如何使用 Laravel 原始查询进行嵌套选择?

SELECT day_of_week, AVG(order_count) average_order FROM 
(
  SELECT DAYNAME(order_date) day_of_week, 
         DAYOFWEEK(order_date) day_num, 
         TO_DAYS(order_date) date,
         count(*) order_count
  FROM orders 
  GROUP BY date
) temp
GROUP BY day_of_week 
ORDER BY day_num

这是我迄今为止尝试过的:

DB::table('(
              SELECT DAYNAME(order_date) day_of_week, 
                     DAYOFWEEK(order_date) day_num, 
                     TO_DAYS(order_date) date,
                     count(*) order_count
              FROM orders 
              GROUP BY date
            ) temp')
            ->select(DB::raw('day_of_week, AVG(order_count) average_order'))
            ->groupBy(DB::raw('day_of_week'))
            ->orderBy(DB::raw('day_num'))
            ->get();

这不起作用,但到目前为止这个查询非常接近。

顺便说一句,我使用的是 Laravel 5.6。

谢谢!

【问题讨论】:

  • 你有没有尝试过?你的 Laravel 版本是什么?
  • @JonasStaudenmeir 我已经用我尝试过的查询更新了我的问题。我正在使用 Laravel 5.6。
  • laravel 中有使用原始查询的方法,你试过@PinoyStackOverflower

标签: mysql laravel eloquent


【解决方案1】:

table() 中使用DB::raw(),不要在groupBy()orderBy() 中使用:

DB::table(DB::raw('(
      SELECT DAYNAME(order_date) day_of_week, 
             DAYOFWEEK(order_date) day_num, 
             TO_DAYS(order_date) date,
             count(*) order_count
      FROM orders 
      GROUP BY date
    ) temp'))
    ->select('day_of_week', DB::raw('AVG(order_count) average_order'))
    ->groupBy('day_of_week')
    ->orderBy('day_num')
    ->get();

你也可以使用fromSub():

$from = DB::table('orders')
    ->selectRaw(
        'DAYNAME(order_date) day_of_week,
        DAYOFWEEK(order_date) day_num, 
        TO_DAYS(order_date) date,
        count(*) order_count'
    )->groupBy('date');
DB::query()->fromSub($from, 'temp')
    ->select('day_of_week', DB::raw('AVG(order_count) average_order'))
    ->groupBy('day_of_week')
    ->orderBy('day_num')
    ->get();

【讨论】:

  • 我不知道我可以在表中使用 DB::raw。非常感谢!你是救世主!
【解决方案2】:

试试这个, 但肯定需要编辑

DB::table('orders')
    ->select(DB::raw('(SELECT order_date AS day_of_week, order_date AS day_num, order_date AS date FROM orders GROUP BY date)'))
    ->groupBy(DB::raw('day_of_week'))
    ->orderBy(DB::raw('day_num'))
    ->get();

【讨论】:

    猜你喜欢
    • 2011-05-16
    • 2019-07-24
    • 1970-01-01
    • 1970-01-01
    • 2019-02-28
    • 1970-01-01
    • 1970-01-01
    • 2013-07-17
    • 1970-01-01
    相关资源
    最近更新 更多