如何将下述UNION ALL结构SQL转换为Laravel查询语句
Laravel查询构造器实现分组取指定条数后UNION ALL的方法
你给出的原生SQL核心逻辑是针对fk_car_model_id的不同取值,分别查询对应条数的记录后用UNION ALL合并,用Laravel查询构造器实现时要注意每个子查询的LIMIT必须独立设置,不能把限制条件写到外层查询,否则会出现逻辑偏差。
实现代码
直接使用查询构造器编写的对应代码如下,生成的SQL和你给出的原生语句完全一致:
// 第一个分组:fk_car_model_id = 3 取5条 $query1 = DB::table('models') ->where('fk_car_model_id', 3) ->limit(5); // 第二个分组:fk_car_model_id = 2 取3条 $query2 = DB::table('models') ->where('fk_car_model_id', 2) ->limit(3); // 第三个分组:fk_car_model_id = 1 取2条 $query3 = DB::table('models') ->where('fk_car_model_id', 1) ->limit(2); // 合并所有子查询,作为临时表查询最终结果 $finalResult = DB::query() ->fromSub( $query1->unionAll($query2)->unionAll($query3), 'models' ) ->select('models.*') ->get();
注意事项
- 如果你是用Eloquent模型操作,把代码里的
DB::table('models')替换成对应模型的查询实例即可,比如\App\Models\Models::query(),其余写法不需要调整。 - 不要在链式调用
unionAll()之后直接调用get(),这种写法生成的SQL会把LIMIT条件作用于整个合并后的结果集,和每个分组单独限制条数的需求不符。 - 如果需要新增其他分组规则,只需要新增对应带where条件、limit限制的子查询,再通过
unionAll()追加到合并链中即可。
内容的提问来源于stack exchange,提问作者Dipali Sakle Systematix
相关产品推荐
相关产品推荐

