关于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 stream_context_create()作用和用法分析
Mar 29 PHP
PHP 命令行参数详解及应用
May 18 PHP
apache+php完美解决301重定向的两种方法
Jun 08 PHP
php和mysql中uft-8中文编码乱码的几种解决办法
Apr 19 PHP
php验证手机号码(支持归属地查询及编码为UTF8)
Feb 01 PHP
PHP常用的文件操作函数经典收藏
Apr 02 PHP
php实现比较两个字符串日期大小的方法
May 12 PHP
php简单实现sql防注入的方法
Apr 22 PHP
PHP实现的各类hash算法长度及性能测试实例
Aug 27 PHP
PHP实现给定一列字符,生成指定长度的所有可能组合示例
Jun 22 PHP
Laravel框架创建路由的方法详解
Sep 04 PHP
PHP遍历数组的6种方式总结
Nov 17 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
拼音码表的生成
2006/10/09 PHP
PHP处理Oracle的CLOB实例
2014/11/03 PHP
PHP封装返回Ajax字符串和JSON数组的方法
2017/02/17 PHP
CI框架(CodeIgniter)公共模型类定义与用法示例
2017/08/10 PHP
PHP多进程之pcntl_fork的实例详解
2017/10/15 PHP
php微信开发之音乐回复功能
2018/06/14 PHP
Laravel5.4框架使用socialite实现github登录的方法
2019/03/20 PHP
常用参考资料(手册)下载或者链接
2006/07/22 Javascript
仿迅雷焦点广告效果(JQuery版)
2008/11/19 Javascript
<script defer> defer 是什么意思
2009/05/10 Javascript
JavaScript 未结束的字符串常量常见解决方法
2010/01/24 Javascript
jQuery滚动加载图片效果的实现
2013/03/06 Javascript
控制台报错object is not a function的解决方法
2014/08/24 Javascript
Internet Explorer 11 浏览器介绍:别叫我IE
2014/09/28 Javascript
javascript Array 数组常用方法
2015/04/05 Javascript
javaScript中push函数用法实例分析
2015/06/08 Javascript
基于Jquery实现表单验证
2020/07/20 Javascript
javascript解决小数的加减乘除精度丢失的方案
2016/05/31 Javascript
详解nodejs 文本操作模块-fs模块(二)
2016/12/22 NodeJs
vue.js指令v-model使用方法
2017/03/20 Javascript
详解react-router如何实现按需加载
2017/06/15 Javascript
想用好React的你必须要知道的一些事情
2017/07/24 Javascript
原生JS实现逼真的图片3D旋转效果详解
2019/02/16 Javascript
JavaScript深入V8引擎以及编写优化代码的5个技巧
2019/06/24 Javascript
Python sys.path详细介绍
2013/10/17 Python
在Django的URLconf中使用多个视图前缀的方法
2015/07/18 Python
Python的Django框架中自定义模版标签的示例
2015/07/20 Python
python如何派生内置不可变类型并修改实例化行为
2018/03/21 Python
python3字符串操作总结
2019/07/24 Python
美国网上眼镜商城:Zenni Optical
2016/11/20 全球购物
西班牙拥有最佳品牌的动物商店:Animalear.com
2018/01/05 全球购物
C语言笔试集
2012/07/24 面试题
创新社会管理心得体会
2014/09/12 职场文书
幼儿园小班教师随笔
2015/08/14 职场文书
JavaScript 去重和重复次数统计
2021/03/31 Javascript
华为HarmonyOS3.0强在哪? 看看鸿蒙3.0这7个小功能
2023/01/09 数码科技