关于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(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。