关于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 相关文章推荐
模拟xcopy的函数
Oct 09 PHP
用PHP开发GUI
Oct 09 PHP
php 字符转义 注意事项
May 27 PHP
PHP设计模式之命令模式的深入解析
Jun 13 PHP
ThinkPHP实例化模型的四种方法概述
Aug 22 PHP
php防止恶意刷新与刷票的方法
Nov 21 PHP
利用PHP将部分内容用星号替换
Apr 21 PHP
CentOS下PHP7的编译安装及MySQL的支持和一些常见问题的解决办法
Dec 17 PHP
PHP.vs.JAVA
Apr 29 PHP
Yii2 hasOne(), hasMany() 实现三表关联的方法(两种)
Feb 15 PHP
为Plesk PHP7启用Oracle OCI8扩展方法总结
Mar 29 PHP
PHP7中I/O模型内核剖析详解
Apr 14 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基础知识:类与对象(1)
2006/12/13 PHP
php feof用来识别文件末尾字符的方法
2010/08/01 PHP
ThinkPHP模板范围判断输出In标签与Range标签用法详解
2014/06/30 PHP
PHP GD库生成图像的几个函数总结
2014/11/19 PHP
Yii实现文章列表置顶功能示例
2016/10/18 PHP
JAVASCRIPT HashTable
2007/01/22 Javascript
zTree插件之多选下拉菜单实例代码
2013/11/06 Javascript
Bootstrap模态窗口源码解析
2017/02/08 Javascript
js 函数式编程学习笔记
2017/03/25 Javascript
Vuejs入门教程之Vue生命周期,数据,手动挂载,指令,过滤器
2017/04/19 Javascript
vue封装第三方插件并发布到npm的方法
2017/09/25 Javascript
JS实现网页抢购功能(触发,终止脚本)
2017/11/27 Javascript
浅谈Vue服务端渲染框架Nuxt的那些事
2018/12/21 Javascript
这样回答继承可能面试官更满意
2019/12/10 Javascript
如何使用webpack打包一个库library的方法步骤
2019/12/18 Javascript
在Vue中创建可重用的 Transition的方法
2020/06/02 Javascript
vue如何搭建多页面多系统应用
2020/06/17 Javascript
在Vue中使用antv的示例代码
2020/06/29 Javascript
微信小程序实现登录注册功能
2020/12/29 Javascript
[01:31](回顾)杀出重围,决战TI之巅
2014/07/01 DOTA
Python操作json数据的一个简单例子
2014/04/17 Python
python实现excel读写数据
2021/03/02 Python
在python 中split()使用多符号分割的例子
2019/07/15 Python
深入了解python中元类的相关知识
2019/08/29 Python
Python编程快速上手——强口令检测算法案例分析
2020/02/29 Python
Python的collections模块真的很好用
2021/03/01 Python
eDreams加拿大:廉价航班、酒店和度假
2019/03/29 全球购物
Sarenza德国:法国最大的时尚鞋和包包网上商店
2019/06/08 全球购物
美国美食礼品篮网站:Gourmet Gift Baskets
2019/12/15 全球购物
外贸销售员求职的自我评价
2013/11/23 职场文书
2014年教师培训的自我评价
2014/01/03 职场文书
质量标语大全
2014/06/12 职场文书
2014年小学生教师节演讲稿范文
2014/09/10 职场文书
2014年幼儿园重阳节活动方案
2014/09/16 职场文书
继承Win10缺点!教你关闭Win11烦人的网络搜索
2021/11/23 数码科技
Java 超详细讲解hashCode方法
2022/04/07 Java/Android