关于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-accelerator网站加速PHP缓冲的方法
Jul 30 PHP
php gd2 上传图片/文字水印/图片水印/等比例缩略图/实现代码
May 15 PHP
php set_time_limit(0) 设置程序执行时间的函数
May 26 PHP
php模拟socket一次连接,多次发送数据的实现代码
Jul 26 PHP
PHP 如何利用phpexcel导入数据库
Aug 24 PHP
php和jquery实现地图区域数据统计展示数据示例
Feb 12 PHP
thinkphp3.2.2前后台公用类架构问题分析
Nov 25 PHP
php对关联数组循环遍历的实现方法
Mar 13 PHP
php示例详解Constructor Prototype Pattern 原型模式
Oct 15 PHP
PHP实现会员账号单唯一登录的方法分析
Mar 07 PHP
PHP进阶学习之依赖注入与Ioc容器详解
Jun 19 PHP
如何在PHP环境中使用ProtoBuf数据格式
Jun 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 Hash函数,增强密码安全
2011/02/25 PHP
使用迭代器 遍历文件信息的详解
2013/06/08 PHP
PHP对接微信公众平台消息接口开发流程教程
2014/03/25 PHP
PHP @ at 记号的作用示例介绍
2014/10/10 PHP
php面向对象与面向过程两种方法给图片添加文字水印
2015/08/26 PHP
使用ucenter实现多站点同步登录的讲解
2019/03/21 PHP
学习YUI.Ext 第六天--关于树TreePanel(Part 2异步获取节点)
2007/03/10 Javascript
实现web打印的各种方法介绍及实现代码
2013/01/09 Javascript
jquery实现的带缩略图的焦点图片切换(自动播放/响应鼠标动作)
2013/01/23 Javascript
javascript基本类型详解
2014/11/28 Javascript
jquery实现简单的自动播放幻灯片效果
2015/06/13 Javascript
JavaScript实现点击单选按钮改变输入框中文本域内容的方法
2015/08/12 Javascript
JS实现同一个网页布局滑动门和TAB选项卡实例
2015/09/23 Javascript
第九篇Bootstrap导航菜单创建步骤详解
2016/06/21 Javascript
jQuery悬停文字提示框插件jquery.tooltipster.js用法示例【附demo源码下载】
2016/07/19 Javascript
初探nodeJS
2017/01/24 NodeJs
JS实现的点击表头排序功能示例
2017/03/27 Javascript
Vue的Class与Style绑定的方法
2017/09/01 Javascript
react-navigation 如何判断用户是否登录跳转到登录页的方法
2017/12/01 Javascript
Koa2微信公众号开发之消息管理
2018/05/16 Javascript
3分钟读懂移动端rem使用方法(推荐)
2019/05/06 Javascript
javascript中this的用法实践分析
2019/07/29 Javascript
Python日期的加减等操作的示例
2017/08/15 Python
wxPython之解决闪烁的问题
2018/01/15 Python
python 图像判断,清晰度(明暗),彩色与黑白实例
2020/06/04 Python
如何通过python检查文件是否被占用
2020/12/18 Python
Python结合百度语音识别实现实时翻译软件的实现
2021/01/18 Python
使用CSS3来实现滚动视差效果的教程
2015/08/24 HTML / CSS
canvas绘制太极图的实现示例
2020/04/29 HTML / CSS
你所在的项目是如何确定版本号的
2015/12/28 面试题
知识竞赛活动方案
2014/02/18 职场文书
体育教师求职信
2014/05/24 职场文书
幼儿教师年度个人总结
2015/02/05 职场文书
有关朝花夕拾的读书笔记
2015/06/29 职场文书
聘任书范文大全
2015/09/21 职场文书
30岁前绝不能错过的10本书
2019/08/08 职场文书