【问题标题】:How do I select columns from results of union of tables using laravel query builder?如何使用 laravel 查询生成器从表联合的结果中选择列?
【发布时间】:2016-09-06 05:14:13
【问题描述】:

我正在尝试将我的 mysql 语句转换为 laravel 查询生成器。在以下查询中,我尝试对从三个表的 UNION-ing 结果中获取的列执行 GROUP BY 和 ORDER BY

  • staff_task_history_calibrate
  • staff_task_history_samples
  • staff_task_history_measures

你们有遇到过类似的吗?如果是的话,你能解释一下我的问题吗?

SELECT staff_name, task_id, task_type, task_desc, SUM(task_multiplier) 
FROM 
(
    (
    select CONCAT(S.first_name," ",S.last_name) as staff_name, 
    `STHC`.`task_id`, IFNULL(T.type, "-") as task_type, 
    `T`.`description` as `task_desc`, 
    STHC.task_multiplier
    from `staff_task_history_calibrate` as `STHC` 
    inner join `staffs` as `S` on `STHC`.`staff_id` = `S`.`staff_id` inner join `tasks` as `T` on `STHC`.`task_id` = `T`.`id` 
    ) 
    union 
    (
    select CONCAT(S.first_name," ",S.last_name) as staff_name, 
    `STHS`.`task_id`, IFNULL(T.type, "-") as task_type, 
    `T`.`description` as `task_desc`, 
    STHS.task_multiplier
    from `staff_task_history_samples` as `STHS` 
    inner join `staffs` as `S` on `STHS`.`staff_id` = `S`.`staff_id` inner join `tasks` as `T` on `STHS`.`task_id` = `T`.`id`
    ) 
    union 
    (
    select CONCAT(S.first_name," ",S.last_name) as staff_name, 
    `STHM`.`task_id`, IFNULL(T.type, "-") as task_type, 
    `T`.`description` as `task_desc`, 
    STHM.task_multiplier
    from `staff_task_history_measures` as `STHM` 
    inner join `staffs` as `S` on `STHM`.`staff_id` = `S`.`staff_id` inner join `tasks` as `T` on `STHM`.`task_id` = `T`.`id`
    )
) combined_tables
GROUP BY staff_name, task_type, task_desc
ORDER BY staff_name, task_type, task_desc;

【问题讨论】:

    标签: mysql laravel laravel-5.2 laravel-query-builder


    【解决方案1】:

    我很难测试,但请尝试:

    // Build up the sub-queries
    $sub1 = DB::table('staff_task_history_calibrate AS STHC')
              ->select(DB::raw(
                'CONCAT(S.first_name," ",S.last_name) as staff_name', 
                'STHC'.'task_id', 'IFNULL(T.type, "-") as task_type',
                'T'.'description' as 'task_desc', 'STHC.task_multiplier')
              )->join('staffs AS S', 'STHC.staff_id', '=', 'S.staff_id')
              ->join('tasks AS T', 'STHC.task_id', '=', 'T.id');
    
    $sub2 = DB::table('staff_task_history_samples AS STHS')
              ->select(DB::raw(
                'CONCAT(S.first_name," ",S.last_name) as staff_name', 
                'STHS'.'task_id', 'IFNULL(T.type, "-") as task_type',
                'T'.'description' as 'task_desc', 'STHS.task_multiplier')
              )->join('staffs AS S', 'STHS.staff_id', '=', 'S.staff_id')
              ->join('tasks AS T', 'STHS.task_id', '=', 'T.id');
    
    $sub3 = DB::table('staff_task_history_measures AS STHM')
              ->select(DB::raw(
                'CONCAT(S.first_name," ",S.last_name) as staff_name', 
                'STHM'.'task_id', 'IFNULL(T.type, "-") as task_type',
                'T'.'description' as 'task_desc', 'STHM.task_multiplier')
              )->join('staffs AS S', 'STHM.staff_id', '=', 'S.staff_id')
              ->join('tasks AS T', 'STHM.task_id', '=', 'T.id');
    
    
    // Add the unions
    $allUnions = $sub1->union($sub2)->union($sub3); // (Check the documentation for Unions in Query Builder)
    
    // Get the results
    $results = DB::table(DB::raw("({$allUnions->toSql()}) as combined_tables"))
           ->select('staff_name, task_id, task_type, task_desc')
           ->sum('task_multiplier')
           ->mergeBindings($allUnions) // We need to retrieve the underlying SQL
           ->groupBy('staff_name')
           ->groupBy('task_type')
           ->groupBy('task_desc')
           ->orderBy('staff_name')
           ->orderBy('task_type')
           ->orderBy('task_desc')
           ->get();
    

    (如果你有什么工作,我会保留它。)

    【讨论】:

    • 我不明白使用mergeBindings 的原因。您能详细介绍一下这种方法吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-01-28
    • 2021-04-27
    • 2018-09-19
    • 2013-01-06
    • 2019-03-28
    • 1970-01-01
    • 2015-12-22
    相关资源
    最近更新 更多