【问题标题】:How to write select query with subquery using laravel Eloquent Querybuilder?如何使用 laravel Eloquent Querybuilder 编写带有子查询的选择查询?
【发布时间】:2017-11-23 20:38:35
【问题描述】:

我已经从查询中得到了结果。

我的简单 SQL 是:

 SELECT
    o2.driver_id,
    total_delieveries,
    DATE_FORMAT(o1.created_at ,'%Y-%m-%d') AS created_at
FROM
    (
        SELECT
            driver_id,
            created_at,
            COUNT(driver_id) AS total_delieveries
        FROM
            orders
        WHERE
            is_paid = 0
        AND order_status = 5
        AND created_at BETWEEN "'.$first_Day.'"
        AND "'.$last_Day.'"
        GROUP BY DATE_FORMAT(created_at ,'%Y-%m-%d'),driver_id
    )
 o1 INNER JOIN orders o2 ON o1.driver_id = o2.driver_id GROUP BY o1.created_at

在 Laravel 源码中,我写了查询:

$responseData =  DB::select(DB::raw('select t.driver_id,total_delieveries,DATE_FORMAT(q1.created_at,\'%Y-%m-%d\') as created_at from (  SELECT driver_id, created_at, COUNT( driver_id ) AS total_delieveries FROM orders WHERE is_paid=0 AND order_status = 5 AND created_at BETWEEN "'.$first_Day.'" AND "'.$last_Day.'" GROUP BY DATE_FORMAT(created_at,\'%Y-%m-%d\'),driver_id) q1 INNER JOIN orders t ON q1.driver_id = t.driver_id GROUP BY q1.created_at'));

我得到了我想要的结果,但我想以更好的方式编写它。

请告诉我编写此查询的正确方法。

【问题讨论】:

    标签: sql laravel laravel-5 eloquent query-builder


    【解决方案1】:

    另外show这个答案和你的变种:

    $subQuery = \DB::table('orders')->selectRaw('driver_id, created_at, COUNT(driver_id) AS total_delieveries')
        ->where('is_paid', 0)
        ->where('order_status', '5')
        ->whereBetween('created_at', [$first_Day, $last_Day])
        ->groupBy(\DB::raw('DATE_FORMAT(created_at ,"%Y-%m-%d"),driver_id'));
    
    $q = \DB::table(\DB::raw('('.$subQuery->toSql().') as o1'))
        ->selectRaw('o2.driver_id,total_delieveries,DATE_FORMAT(o1.created_at ,"%Y-%m-%d") AS created_at')
        ->join('orders as o2', 'o1.driver_id', '=', 'o2.driver_id')
        ->groupBy('o1.created_at')
        ->mergeBindings($subQuery)
        ->get();
    

    【讨论】:

    • 我已经在 $q 语句中修改了您的代码,该语句以 get() 结尾。所以,我放了这个。 SQLSTATE[HY000]: 一般错误: 2031 (SQL: select o2.driver_id,total_delieveries,DATE_FORMAT(o1.created_at ,"%Y-%m-%d") AS created_at from (select driver_id, created_at, COUNT(driver_id) AS来自orders 的total_delieveries,其中is_paid = ? 和order_status = ? 和created_at 在? 和? 之间按DATE_FORMAT(created_at ,"%Y-%m-%d"),driver_id) 作为o1 内连接@ 987654327@ as o2 on o1.driver_id = o2.driver_id group by o1.created_at)
    • 我更新了我的答案。在get() 之前添加->mergeBindings($subQuery)$subQuerywhere 子句中只返回没有值的sql 字符串,mergeBindings 将其添加到最后的$q
    猜你喜欢
    • 1970-01-01
    • 2020-01-23
    • 2023-03-10
    • 2021-04-08
    • 1970-01-01
    • 1970-01-01
    • 2020-08-28
    • 2019-06-07
    • 1970-01-01
    相关资源
    最近更新 更多