关于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 论坛采集程序 模拟登陆,抓取页面 实现代码
Jul 09 PHP
MayFish PHP的MVC架构的开发框架
Aug 13 PHP
PHP程序员面试 切忌急功近利(更需要注重以后的发展)
Sep 01 PHP
PHP中break及continue两个流程控制指令区别分析
Apr 18 PHP
微信公众平台消息接口校验与消息接口响应实例
Dec 23 PHP
php输出指定时间以前时间格式的方法
Mar 21 PHP
PHP加密技术的简单实现
Sep 04 PHP
PHP编写daemon process 实例详解
Nov 13 PHP
PHP封装curl的调用接口及常用函数详解
May 31 PHP
PHP asXML()函数讲解
Feb 03 PHP
从ThinkPHP3.2.3过渡到ThinkPHP5.0学习笔记图文详解
Apr 03 PHP
Laravel 微信小程序后端搭建步骤详解
Nov 26 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中禁止单个IP与ip段访问的代码小结
2012/07/04 PHP
PHP的RSA加密解密方法以及开发接口使用
2018/02/11 PHP
使javascript也能包含文件
2006/10/26 Javascript
论坛特效代码收集(落伍转发-不错)
2006/12/02 Javascript
javascript小数计算出现近似值的解决办法
2010/02/06 Javascript
根据IP的地址,区分不同的地区,查看不同的网站页面的js代码
2013/02/26 Javascript
jQuery 关于伪类选择符的使用说明
2013/04/24 Javascript
Node.js返回JSONP详解
2016/05/18 Javascript
Ionic如何创建APP项目
2016/06/03 Javascript
js实现简单的碰壁反弹效果
2016/08/30 Javascript
利用Node.js编写跨平台的spawn语句详解
2017/02/12 Javascript
bootstrap基本配置_动力节点Java学院整理
2017/07/14 Javascript
cropper js基于vue的图片裁剪上传功能的实现代码
2018/03/01 Javascript
Vue渲染过程浅析
2019/03/14 Javascript
Vue实现菜单切换功能
2020/11/08 Javascript
详解Vue.js 可拖放文本框组件的使用
2021/03/03 Vue.js
Python类的多重继承问题深入分析
2014/11/09 Python
python实现用于测试网站访问速率的方法
2015/05/26 Python
微信跳一跳python辅助脚本(总结)
2018/01/11 Python
调用其他python脚本文件里面的类和方法过程解析
2019/11/15 Python
浅谈Django QuerySet对象(模型.objects)的常用方法
2020/03/28 Python
CSS3 background-image颜色渐变的实现代码
2018/09/13 HTML / CSS
美国最大的珠宝首饰网上商城:Jewelry.com
2016/07/22 全球购物
国际领先的学术出版商:Springer
2017/01/11 全球购物
世界上最大的罕见唱片、CD和音乐纪念品网上商店:991.com
2018/05/03 全球购物
Noon埃及:埃及在线购物
2019/11/26 全球购物
自考生自我鉴定范文
2013/10/01 职场文书
合同协议书格式
2014/04/18 职场文书
最美家庭活动方案
2014/08/31 职场文书
2014领导干部学习焦裕禄同志先进事迹思想汇报
2014/09/19 职场文书
基层党员干部四风问题整改方向和措施
2014/09/25 职场文书
2014年检验科工作总结
2014/11/22 职场文书
2015年仓管员工作总结
2015/04/21 职场文书
小学运动会加油稿
2015/07/22 职场文书
python基于tkinter制作m3u8视频下载工具
2021/04/24 Python
python opencv通过按键采集图片源码
2021/05/20 Python