关于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 文件缓存函数
Oct 08 PHP
PHP读取文件并可支持远程文件的代码分享
Oct 03 PHP
PHP超级全局变量数组小结
Oct 04 PHP
PHP自动生成后台导航网址的最佳方法
Aug 27 PHP
PHP中遇到BOM、编码导致json_decode函数无法解析问题
Jul 02 PHP
php最简单的删除目录与文件实现方法
Nov 28 PHP
适用于初学者的简易PHP文件上传类
Oct 29 PHP
php实现图片上传、剪切功能
May 07 PHP
apache php mysql开发环境安装教程
Jul 28 PHP
简单谈谈 php 文件锁
Feb 19 PHP
PHP实现APP微信支付的实例讲解
Feb 10 PHP
Yii框架布局文件的动态切换操作示例
Nov 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下利用curl判断远程文件是否存在的实现代码
2011/10/08 PHP
深入PHP运行环境配置的详解
2013/06/04 PHP
解析如何屏蔽php中的phpinfo()函数
2013/06/06 PHP
实现PHP+Mysql无限分类的方法汇总
2015/03/02 PHP
Yii2.0高级框架数据库增删改查的一些操作
2015/11/16 PHP
php实现批量修改文件名称的方法
2016/07/23 PHP
Prototype源码浅析 String部分(三)之HTML字符串处理
2012/01/15 Javascript
jquery右下角弹出提示框示例代码
2013/10/08 Javascript
JS中的log对象获取以及debug的写法介绍
2014/03/03 Javascript
javascript实现网站加入收藏功能
2015/12/16 Javascript
浅谈JavaScript中数组的增删改查
2016/06/20 Javascript
原生js实现鼠标跟随效果
2017/02/28 Javascript
vue指令以及dom操作详解
2017/03/04 Javascript
客户端(vue框架)与服务器(koa框架)通信及服务器跨域配置详解
2017/08/26 Javascript
JavaScript读写二进制数据的方法详解
2018/09/09 Javascript
详解vue父子组件状态同步的最佳方式
2020/09/10 Javascript
浅谈javascript事件环微任务和宏任务队列原理
2020/09/12 Javascript
vue中实现点击变成全屏的多种方法
2020/09/27 Javascript
微信小程序实现首页弹出广告
2020/12/03 Javascript
VUE中鼠标滚轮使div左右滚动的方法详解
2020/12/14 Vue.js
python实现simhash算法实例
2014/04/25 Python
通过Python 获取Android设备信息的轻量级框架
2017/12/18 Python
python中abs&map&reduce简介
2018/02/20 Python
Python实现的计算马氏距离算法示例
2018/04/03 Python
Django 多环境配置详解
2019/05/14 Python
pytorch使用Variable实现线性回归
2019/05/21 Python
简单介绍python封装的基本知识
2019/08/10 Python
Django REST框架创建一个简单的Api实例讲解
2019/11/05 Python
python 中关于pycharm选择运行环境的问题
2020/10/31 Python
西班牙三叶草药房:Farmacias Trébol
2019/05/03 全球购物
护士辞职信范文
2014/01/19 职场文书
土建专业大学生自荐信范文
2014/04/09 职场文书
婚前协议书怎么写
2014/04/15 职场文书
2014年环保局工作总结
2014/12/11 职场文书
TV动画《神废柴☆偶像》公布先导PV
2022/03/20 日漫
vue/cli 配置动态代理无需重启服务的方法
2022/05/20 Vue.js