关于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&mysql(一)
Oct 09 PHP
PHP 内存缓存加速功能memcached安装与用法
Sep 03 PHP
php 攻击方法之谈php+mysql注射语句构造
Oct 30 PHP
基于php在各种web服务器的运行模式详解
Jun 03 PHP
Drupal7 form表单二次开发要点与实例
Mar 02 PHP
php获取字段名示例分享
Mar 03 PHP
ThinkPHP空模块和空操作详解
Jun 30 PHP
PHP实现删除字符串中任何字符的函数
Aug 11 PHP
php使用ZipArchive函数实现文件的压缩与解压缩
Oct 27 PHP
thinkphp3.x自定义Action、Model及View的简单实现方法
May 19 PHP
php array_keys 返回数组的键名
Oct 25 PHP
PHP chunk_split()函数讲解
Feb 12 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
BBS(php & mysql)完整版(五)
2006/10/09 PHP
PHP引用返回用法示例
2016/05/28 PHP
PHP+jquery+CSS制作头像登录窗(仿QQ登陆)
2016/10/20 PHP
cakephp常见知识点汇总
2017/02/24 PHP
JavaScript高级程序设计(第3版)学习笔记12 js正则表达式
2012/10/11 Javascript
Javascript Web Slider 焦点图示例源码
2013/10/10 Javascript
jquery 检测元素是否存在的实例代码
2013/11/19 Javascript
javascript根据时间生成m位随机数最大13位
2014/10/30 Javascript
javascript实现网页字符定位的方法
2015/07/14 Javascript
jquery验证邮箱格式并显示提交按钮
2015/11/07 Javascript
Jquery中巧用Ajax的beforeSend方法
2016/01/20 Javascript
深入理解JS中的substr和substring
2016/04/26 Javascript
浅析jQuery Ajax通用js封装
2016/06/22 Javascript
正则验证小数点后面只能有两位数的方法
2017/02/28 Javascript
JS实现运动缓冲效果的封装函数示例
2018/02/18 Javascript
ES6中let 和 const 的新特性
2018/09/03 Javascript
iview实现select tree树形下拉框的示例代码
2018/12/21 Javascript
JavaScript的Proxy可以做哪些有意思的事儿
2019/06/15 Javascript
[00:37]2016完美“圣”典风云人物:AMS宣传片
2016/12/06 DOTA
详解Python的迭代器、生成器以及相关的itertools包
2015/04/02 Python
python 读写文件,按行修改文件的方法
2018/07/12 Python
在Pandas中给多层索引降级的方法
2018/11/16 Python
详解Python并发编程之从性能角度来初探并发编程
2019/08/23 Python
opencv3/C++图像像素操作详解
2019/12/10 Python
解决Pycharm 导入其他文件夹源码的2种方法
2020/02/12 Python
python通过对字典的排序,对json字段进行排序的实例
2020/02/27 Python
Python函数基本使用原理详解
2020/03/19 Python
Lacoste(法国鳄鱼)加拿大官网:以标志性的POLO衫而闻名
2019/05/15 全球购物
英国领先的高级美容和在线皮肤诊所:Face the Future
2020/06/17 全球购物
化工工艺专业求职信
2013/09/22 职场文书
毕业生优秀推荐信
2013/11/26 职场文书
业务副厂长岗位职责
2014/01/03 职场文书
事务机电主管工作职责
2014/02/25 职场文书
管理工程专业求职信
2014/08/10 职场文书
销售团队获奖感言
2014/08/14 职场文书
房屋转让协议书(标准范本)
2016/03/21 职场文书