关于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 相关文章推荐
php获取mysql版本的几种方法小结
Mar 25 PHP
php中is_null,empty,isset,unset 的区别详细介绍
Apr 28 PHP
PHP设计模式之调解者模式的深入解析
Jun 13 PHP
浅析linux下apache服务器的配置和管理
Aug 10 PHP
PHP实现图片裁剪、添加水印效果代码
Oct 01 PHP
php读取csv数据保存到数组的方法
Jan 03 PHP
php通过正则表达式记取数据来读取xml的方法
Mar 09 PHP
使用PHP生成图片的缩略图的方法
Aug 18 PHP
PHP使用Memcache时模拟命名空间及缓存失效问题的解决
Feb 27 PHP
PHP处理CSV表格文件的常用操作方法总结
Jul 01 PHP
php获取'/'传参的值简单方法
Jul 13 PHP
记录Yii2框架开发微信公众号遇到的问题及解决方法
Jul 20 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 破解防盗链图片函数
2008/12/09 PHP
PHP 使用MySQL管理Session的回调函数详解
2013/06/21 PHP
PHP下载远程文件到本地存储的方法
2015/03/24 PHP
PHP判断文件是否被引入的方法get_included_files用法示例
2016/11/29 PHP
php中文乱码问题的终极解决方案汇总
2017/08/01 PHP
JQuery 入门实例1
2009/06/25 Javascript
javascript特殊用法示例介绍
2013/11/29 Javascript
JS完整获取IE浏览器信息包括类型、版本、语言等等
2014/05/22 Javascript
20个实用的JavaScript技巧分享
2014/11/28 Javascript
基于JS实现发送短信验证码后的倒计时功能(无视页面刷新,页面关闭不进行倒计时功能)
2016/09/02 Javascript
JS自定义混合Mixin函数示例
2016/11/26 Javascript
vue mixins组件复用的几种方式(小结)
2017/09/06 Javascript
vue中mint-ui的使用方法
2018/04/04 Javascript
Vue + better-scroll 实现移动端字母索引导航功能
2018/05/07 Javascript
js 实现在2d平面上画8的方法
2018/10/10 Javascript
使用vue-cli脚手架工具搭建vue-webpack项目
2019/01/14 Javascript
小程序实现按下录音松开识别语音
2019/11/22 Javascript
微信小程序事件流原理解析
2019/11/27 Javascript
mpvue 项目初始化及实现授权登录的实现方法
2020/07/20 Javascript
Vue和React有哪些区别
2020/09/12 Javascript
[01:29]2017 DOTA2国际邀请赛官方英雄手办展示
2017/03/18 DOTA
Python魔术方法详解
2015/02/14 Python
Python使用迭代器捕获Generator返回值的方法
2017/04/05 Python
Python实现的tcp端口检测操作示例
2018/07/24 Python
解决pycharm安装后代码区不能编辑的问题
2018/10/28 Python
Python实现的银行系统模拟程序完整案例
2019/04/12 Python
python使用OpenCV模块实现图像的融合示例代码
2020/04/10 Python
Python扫描端口的实现
2021/01/25 Python
Python 中 sorted 如何自定义比较逻辑
2021/02/02 Python
华纳兄弟工作室的官方授权商店:WB Shop
2018/11/30 全球购物
JPA的特点
2014/10/25 面试题
跟单文员的岗位职责
2013/11/14 职场文书
医学实习生自我鉴定
2013/12/12 职场文书
《理想》教学反思
2014/02/17 职场文书
学校食堂标语
2014/10/06 职场文书
Django + Taro 前后端分离项目实现企业微信登录功能
2022/04/07 Python