关于laravel 子查询 & join的使用
本项目中关联了2个数据库
'default'=>env('DB_CONNECTION','mysql'),//默认使用mysql为连接库 'connections'=>[ 'mysql'=>[ 'driver'=>'mysql', 'host'=>'192.168.0.xx', 'database'=>'database', 'username'=>'root', 'password'=>'', 'charset'=>'utf8', 'collation'=>'utf8_unicode_ci', 'prefix'=>'tb_', 'strict'=>false, ], 'mysql_snapshot'=>[ 'driver'=>'mysql', 'host'=>env('DB_HOST_SNAPSHOT','192.168.0.xx'), 'database'=>env('DB_DATABASE_SNAPSHOT','snapshot'), 'username'=>env('DB_USERNAME_SNAPSHOT','root'), 'password'=>env('DB_PASSWORD_SNAPSHOT',''), 'charset'=>'utf8', 'collation'=>'utf8_unicode_ci', 'prefix'=>'tb_', 'strict'=>false, ], ],
在某个需求中,需要使用子查询获取snapshot快照表库的关联数据,从而实现以下sql逻辑
SELECT...From (SELECT sum(game_count)ASsum_count, max(game_count)ASmax_count, game_room_id, record_date FROM `tb_xx_snapshot` WHERE record_dateBETWEEN'2017-05-17'AND'2017-05-23' AND type='1' GROUPBY game_room_id)asmain INNERJOIN`tb_xx_snapshot`AS`tb_gg`ONtb_gg.game_count=main.max_countandtb_gg.game_room_id=main.game_room_id where tb_gg.record_dateBETWEEN'2017-05-17'AND'2017-05-23' AND tb_gg.type='1' GROUPBY tb_gg.game_room_id;
其中子查询主要用到以下querybuilder语句
$query=DB::table('xx_snapshot')->where('xx','yy')->groupBy('xx'); $main=DB::connection('mysql_snapshot') ->table(DB::raw("({$query->toSql()})astb_main")) ->mergeBindings($query->getQuery())//绑定参数,否则sql语句会只有'?' ->get();
而join语句中可传入匿名函数重新构造,如再其中加多几个连接条件,或者查询条件
$con=DB::table('xx_snapshot') ->join('xx_snapshotasgg',function($query){ $query->on('gg.game_count','=','xx_snapshot.max_count') ->on('gg.game_room_id','=','xx_snapshot.game_room_id') ->where('gg.xx','123'; })
实现上述需求完整代码如下:
$subQuery=GameroomModel::select(DB::raw('sum(game_count)assum_count,max(game_count)asmax_count,record_date,game_room_id')) ->whereBetween('record_date',[$beginDay,$endDay]) ->where('type','1') ->groupBy('game_room_id'); $main=DB::connection('mysql_snapshot') ->table(DB::raw("({$subQuery->toSql()})astb_main")) ->mergeBindings($playerGame->getQuery()) ->join('gameroom_snapshotasgg',function($join){ $join->on('gg.game_count','=','main.max_count') ->on('gg.game_room_id','=','main.game_room_id'); }) ->select('main.max_count','main.sum_count','gg.record_date','main.game_room_id') ->whereBetween('gg.record_date',[$beginDay,$endDay]) ->groupBy('main.game_room_id') ->get();
代码中子查询和外层都groupby了一次,应该可以再优化一下.
以上这篇关于laravel子查询&join的使用就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持毛票票。
声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:czq8825#qq.com(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。