关于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 相关文章推荐
怎样在UNIX系统下安装php3
Oct 09 PHP
fleaphp下不确定的多条件查询的巧妙解决方法
Sep 11 PHP
一步一步学习PHP(5) 类和对象
Feb 16 PHP
php开发留言板的CRUD(增,删,改,查)操作
Apr 19 PHP
php中使用exec,system等函数调用系统命令的方法(不建议使用,可导致安全问题)
Sep 07 PHP
php中socket的用法详解
Oct 24 PHP
php绘制一条弧线的方法
Jan 24 PHP
PHP设计模式之装饰者模式代码实例
May 11 PHP
Redis构建分布式锁
Mar 28 PHP
PHP基于PDO实现的SQLite操作类【包含增删改查及事务等操作】
Jun 21 PHP
tp5(thinkPHP5)框架实现多数据库查询的方法
Jan 10 PHP
php实现的顺序线性表示例
May 04 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
使用gd库实现php服务端图片裁剪和生成缩略图功能分享
2013/12/25 PHP
thinkphp判断访客为手机端或PC端的方法
2014/11/24 PHP
详解在PHP的Yii框架中使用行为Behaviors的方法
2016/03/18 PHP
PHP的mysqli_sqlstate()函数讲解
2019/01/23 PHP
AutoSave/自动存储功能实现
2007/03/24 Javascript
[全兼容哦]--实用、简洁、炫酷的页面转入效果loing
2007/05/07 Javascript
javascript 关于# 和 void的区别分析
2009/10/26 Javascript
下拉列表select 由左边框移动到右边示例
2013/12/04 Javascript
Javascript中的String对象详谈
2014/03/03 Javascript
jQuery中extend()和fn.extend()方法详解
2015/06/03 Javascript
轻松学习jQuery插件EasyUI EasyUI创建CRUD应用
2015/11/30 Javascript
JS基于HTML5的canvas标签实现炫目的色相球动画效果实例
2016/08/24 Javascript
Vue表单验证插件Vue Validator使用方法详解
2017/04/07 Javascript
收藏AngularJS中最重要的核心功能
2017/07/09 Javascript
vue 插值 v-once,v-text, v-html详解
2018/01/19 Javascript
vue实现a标签点击高亮方法
2018/03/17 Javascript
微信小程序实现的五星评价功能示例
2019/04/25 Javascript
微信小程序如何使用globalData的方法
2019/06/06 Javascript
Centos7 安装Node.js10以上版本的方法步骤
2019/10/15 Javascript
微信小程序自定义模态弹窗组件详解
2019/12/24 Javascript
[04:29]2014DOTA2国际邀请赛 主赛事第三日TOPPLAY
2014/07/21 DOTA
Python使用pylab库实现绘制直方图功能示例
2018/06/01 Python
Python DataFrame设置/更改列表字段/元素类型的方法
2018/06/09 Python
基于wxPython的GUI实现输入对话框(1)
2019/02/27 Python
python自动化UI工具发送QQ消息的实例
2019/08/27 Python
如何使用python3获取当前路径及os.path.dirname的使用
2019/12/13 Python
canvas 基础之图像处理的使用
2020/04/10 HTML / CSS
华为俄罗斯官方网上商城:购买Huawei手机和平板
2017/04/21 全球购物
Rosetta Stone官方网站:语言学习
2019/01/05 全球购物
remote接口和home接口主要作用
2013/05/15 面试题
《地震中的父与子》教学反思
2014/04/10 职场文书
转让协议书范本
2014/04/15 职场文书
学校联谊协议书
2014/09/16 职场文书
2014年小班保育员工作总结
2014/12/23 职场文书
重阳节慰问信
2015/02/15 职场文书
英国数字版游戏销量周榜公布 《小缇娜的奇幻之地》登顶
2022/04/03 其他游戏