Laravel QueryBuilder已有select语句中插入GREATEST函数查询多列最大日期
解决方案
你原有写法的问题是在DB::raw中嵌套了独立的SELECT子查询,属于冗余逻辑,且没有和当前查询的行做关联,导致end字段无法正常返回。
修正后代码
$ses = DB::table('ses_contracts') ->join('ses_worker','ses_contracts.id','ses_worker.ses_id') ->join('corporates','corporates.id','ses_contracts.outsourcer') ->select([ 'corporates.corpname as outsourcer', 'ses_contracts.outsourcer_manager_name as manager_name', 'ses_worker.worker_name as worker_name', 'ses_worker.sesnum1 as sesnum1', 'ses_worker.sesnum2 as sesnum2', 'ses_contracts.work_date1 as start', // 取6个日期列最大值的正确写法 DB::raw('GREATEST(work_date1, work_date2, work_date3, work_date4, work_date5, work_date6) as end') ]) ->get(); die($ses);
补充说明
- 当前查询已经关联了
ses_contracts表,不需要在字段表达式中额外加SELECT和from ses_contracts语句,数据库会自动对每一行的对应字段计算最大值 - 如果你的6个日期字段存在NULL值,MySQL的
GREATEST函数遇到NULL会直接返回NULL,建议对每个字段加IFNULL处理,示例:DB::raw("GREATEST(IFNULL(work_date1, '1970-01-01'), IFNULL(work_date2, '1970-01-01'), IFNULL(work_date3, '1970-01-01'), IFNULL(work_date4, '1970-01-01'), IFNULL(work_date5, '1970-01-01'), IFNULL(work_date6, '1970-01-01')) as end")
内容的提问来源于stack exchange,提问作者Vince
相关产品推荐
相关产品推荐

