关于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 相关文章推荐
dede3.1分页文字采集过滤规则详说(图文教程)
Apr 03 PHP
PHP批量采集下载美女图片的实现代码
Jun 03 PHP
PHP5各个版本的新功能和新特性总结
Mar 16 PHP
php遍历目录方法小结
Mar 10 PHP
php通过array_push()函数添加多个变量到数组末尾的方法
Mar 18 PHP
php筛选不存在的图片资源
Apr 28 PHP
php跨服务器访问方法小结
May 12 PHP
PHP连接Nginx服务器并解析Nginx日志的方法
Aug 16 PHP
PHP中STDCLASS用法实例分析
Nov 11 PHP
php导出csv文件,可导出前导0实例代码
Nov 16 PHP
php无限级分类实现评论及回复功能
Feb 18 PHP
PHP函数积累总结
Mar 19 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小偷相关截取函数备忘
2010/11/28 PHP
PHP页面间参数传递的四种方法详解
2013/06/09 PHP
PHP生成唯一订单号
2015/07/05 PHP
Zend Framework教程之路由功能Zend_Controller_Router详解
2016/03/07 PHP
php中mkdir()函数的权限问题分析
2016/09/24 PHP
使用laravel的Eloquent模型如何获取数据库的指定列
2019/10/17 PHP
javascript字典探测用户名工具
2006/10/05 Javascript
定义JavaScript二维数组采用定义数组的数组来实现
2012/12/09 Javascript
js或jquery实现页面打印可局部打印
2014/03/27 Javascript
JQuery用户名校验的具体实现
2016/03/18 Javascript
Bootstrap嵌入jqGrid,使你的table牛逼起来
2016/05/05 Javascript
JQuery Mobile 弹出式登录框的实现方法
2016/05/28 Javascript
使用base64对图片的二进制进行编码并用ajax进行显示
2017/01/03 Javascript
JavaScript之排序函数_动力节点Java学院整理
2017/06/30 Javascript
利用babel将es6语法转es5的简单示例
2017/12/01 Javascript
React学习笔记之高阶组件应用
2018/06/02 Javascript
Vue表单demo v-model双向绑定问题
2018/06/29 Javascript
react中实现搜索结果中关键词高亮显示
2018/07/31 Javascript
在element-ui的select下拉框加上滚动加载
2019/04/18 Javascript
axios 实现post请求时把对象obj数据转为formdata
2019/10/31 Javascript
bootstrap-closable-tab可实现关闭的tab标签页插件
2020/08/09 Javascript
JavaScript实现4位随机验证码的生成
2021/01/28 Javascript
[02:45]DOTA2英雄敌法师基础教程
2013/11/25 DOTA
使用scrapy实现爬网站例子和实现网络爬虫(蜘蛛)的步骤
2014/01/23 Python
Go语言基于Socket编写服务器端与客户端通信的实例
2016/02/19 Python
python基础while循环及if判断的实例讲解
2017/08/25 Python
python使用udp实现聊天器功能
2018/12/10 Python
python内存动态分配过程详解
2019/07/15 Python
python定间隔取点(np.linspace)的实现
2019/11/27 Python
uniapp+Html5端实现PC端适配
2020/07/15 HTML / CSS
国际书籍零售商:Wordery
2017/11/01 全球购物
探索欧洲最好的品牌:Bombinate
2019/06/14 全球购物
大学新生军训感言
2014/02/25 职场文书
2015年秋季小学开学典礼主持词
2015/07/16 职场文书
安全主题班会教案
2015/08/12 职场文书
Springboot如何同时装配两个相同类型数据库
2021/11/17 Java/Android