关于laravel 子查询 & join的使用


Posted in PHP onOctober 16, 2019

本项目中关联了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) AS sum_count,
  max(game_count) AS max_count,
  game_room_id,
  record_date
 FROM
  `tb_xx_snapshot`
  WHERE
  record_date BETWEEN '2017-05-17' AND '2017-05-23'
  AND 
  type = '1'
  GROUP BY 
  game_room_id) as main
INNER JOIN `tb_xx_snapshot` AS `tb_gg` ON tb_gg.game_count = main.max_count and tb_gg.game_room_id = main.game_room_id
where
 tb_gg.record_date BETWEEN '2017-05-17' AND '2017-05-23'
AND 
 tb_gg.type = '1'
GROUP BY 
 tb_gg.game_room_id;

其中子查询主要用到以下query builder语句

$query = DB::table('xx_snapshot')->where('xx','yy')->groupBy('xx');
$main = DB::connection('mysql_snapshot')
  ->table(DB::raw("({$query->toSql()}) as tb_main"))
  ->mergeBindings($query->getQuery()) // 绑定参数,否则sql语句会只有'?'
  ->get();

而join语句中可传入匿名函数重新构造,如再其中加多几个连接条件,或者查询条件

$con = DB::table('xx_snapshot')
  ->join('xx_snapshot as gg', 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) as sum_count,max(game_count) as max_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()}) as tb_main"))
  ->mergeBindings($playerGame->getQuery())
  ->join('gameroom_snapshot as gg', 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();

代码中子查询和外层都group by了一次,应该可以再优化一下.

以上这篇关于laravel 子查询 & join的使用就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

PHP 相关文章推荐
Discuz! 5.0.0论坛程序中加入一段js代码,让会员点击下载附件前自动弹出提示窗口
Apr 18 PHP
PHP句法规则详解 入门学习
Nov 09 PHP
深入php self与$this的详解
Jun 08 PHP
解析关于java,php以及html的所有文件编码与乱码的处理方法汇总
Jun 24 PHP
php实现扫描二维码根据浏览器类型访问不同下载地址
Oct 15 PHP
WordPress主题中添加文章列表页页码导航的PHP代码实例
Dec 22 PHP
twig里使用js变量的方法
Feb 05 PHP
java微信开发之上传下载多媒体文件
Jun 24 PHP
php获取ajax的headers方法与内容实例
Dec 27 PHP
PHP Class SoapClient not found解决方法
Jan 20 PHP
PHP基于session.upload_progress 实现文件上传进度显示功能详解
Aug 09 PHP
Laravel获取当前请求的控制器和方法以及中间件的例子
Oct 11 PHP
laravel高级的Join语法详解以及使用Join多个条件
Oct 16 #PHP
Laravel 连接(Join)示例
Oct 16 #PHP
Thinkphp 在api开发中异常返回依然是html的解决方式
Oct 16 #PHP
PHP 代码简洁之道(小结)
Oct 16 #PHP
解决tp5在nginx下修改配置访问的问题
Oct 16 #PHP
Laravel6.2中用于用户登录的新密码确认流程详解
Oct 16 #PHP
PHP实现15位身份证号转18位的方法分析
Oct 16 #PHP
You might like
如何在PHP中使用Oracle数据库(3)
2006/10/09 PHP
网站用php实现paypal整合方法
2010/11/28 PHP
php中将汉字转换成拼音的函数代码
2012/09/08 PHP
php支付宝在线支付接口开发教程
2016/09/19 PHP
Laravel框架基于ajax和layer.js实现无刷新删除功能示例
2019/01/17 PHP
jquery里的each使用方法详解
2010/12/22 Javascript
jquery插件开发方法(初学者)
2012/02/03 Javascript
js实现点击获取验证码倒计时效果
2021/01/28 Javascript
理解javascript模块化
2016/03/28 Javascript
jQuery实现区域打印功能代码详解
2016/06/17 Javascript
利用JQuery直接调用asp.net后台的简单方法
2016/10/27 Javascript
进阶之初探nodeJS
2017/01/24 NodeJs
jquery精度计算代码 jquery指定精确小数位
2017/02/06 Javascript
js实现数组和对象的深浅拷贝
2017/09/30 Javascript
JS实现利用两个队列表示一个栈的方法
2017/12/13 Javascript
Vue全局分页组件的实现代码
2018/08/10 Javascript
JavaScript对象拷贝与赋值操作实例分析
2018/12/10 Javascript
VUE兄弟组件传值操作实例分析
2019/10/26 Javascript
vue 项目软键盘回车触发搜索事件
2020/09/09 Javascript
[04:36]DOTA2国际邀请赛 ti3精彩集锦
2013/08/19 DOTA
[38:21]2014 DOTA2国际邀请赛中国区预选赛5.21 TongFu VS LGD-CDEC
2014/05/22 DOTA
Python 编码处理-str与Unicode的区别
2016/09/06 Python
python实现批量按比例缩放图片效果
2018/03/30 Python
Python实现读取机器硬件信息的方法示例
2018/06/09 Python
解决使用pycharm提交代码时冲突之后文件丢失找回的方法
2018/08/05 Python
Python中一般处理中文的几种方法
2019/03/06 Python
Python实现的删除重复文件或图片功能示例【去重】
2019/04/23 Python
详解css3 mask遮罩实现一些特效
2018/10/24 HTML / CSS
需要知道的CSS3动画技术
2010/01/01 HTML / CSS
金宝贝童装官网:Gymboree
2016/08/31 全球购物
美国大尺码女装零售商:TORRID
2016/10/01 全球购物
英国Office鞋店德国网站:在线购买鞋子、靴子和运动鞋
2018/12/19 全球购物
物流创业计划书
2014/02/01 职场文书
房地产销售主管岗位职责
2015/02/13 职场文书
信息简报范文
2015/07/21 职场文书
利用Pycharm连接服务器的全过程记录
2021/07/01 Python