关于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 相关文章推荐
adodb与adodb_lite之比较
Dec 31 PHP
dedecms采集中可以过滤多行代码的正则表达式
Mar 17 PHP
php连接mysql数据库代码
Mar 10 PHP
如何解决CI框架的Disallowed Key Characters错误提示
Jul 05 PHP
php实现可以设置中奖概率的抽奖程序代码分享
Jan 19 PHP
php使用正则过滤js脚本代码实例
May 10 PHP
让CodeIgniter的ellipsize()支持中文截断的方法
Jun 12 PHP
PHP的mysqli_query参数MYSQLI_STORE_RESULT和MYSQLI_USE_RESULT的区别
Sep 29 PHP
PHP、Python和Javascript的装饰器模式对比
Feb 03 PHP
支付宝支付开发――当面付条码支付和扫码支付实例
Nov 04 PHP
PHP单态模式简单用法示例
Nov 16 PHP
php设计模式之适配器模式实例分析【星际争霸游戏案例】
Apr 07 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+MYSQL 出现乱码的解决方法
2008/08/08 PHP
用mysql触发器自动更新memcache的实现代码
2009/10/11 PHP
PHP spl_autoload_register实现自动加载研究
2011/12/06 PHP
基于Zend的Captcha机制的应用
2013/05/02 PHP
在php和MySql中计算时间差的方法详解
2015/03/27 PHP
php传值赋值和传地址赋值用法实例分析
2015/06/20 PHP
/etc/php-fpm.d/www.conf 配置注意事项
2017/02/04 PHP
JavaScript判断textarea值是否为空并给出相应提示
2014/09/04 Javascript
JS实现向表格行添加新单元格的方法
2015/03/30 Javascript
js实现兼容IE和FF的上下层的移动
2015/05/04 Javascript
jquery实现简易的移动端验证表单
2015/11/08 Javascript
轻松实现js选项卡切换效果
2016/09/24 Javascript
js前端日历控件(悬浮、拖拽、自由变形)
2017/03/02 Javascript
详解通过JSON数据使用VUE.JS
2017/05/26 Javascript
微信小程序 蓝牙的实现实例代码
2017/06/27 Javascript
vue awesome swiper异步加载数据出现的bug问题
2018/07/03 Javascript
vue基础之事件v-onclick="函数"用法示例
2019/03/11 Javascript
在 Vue 应用中使用 Netlify 表单功能的方法详解
2019/06/03 Javascript
微信小程序实现蒙版弹出窗功能
2019/09/17 Javascript
Element Badge标记的使用方法
2020/07/27 Javascript
Python和Perl绘制中国北京跑步地图的方法
2016/03/03 Python
对pandas中apply函数的用法详解
2018/04/10 Python
对Python 3.5拼接列表的新语法详解
2018/11/08 Python
python如果快速判断数字奇数偶数
2019/11/13 Python
Python装饰器原理与基本用法分析
2020/01/07 Python
python sitk.show()与imageJ结合使用常见的问题
2020/04/20 Python
python的help函数如何使用
2020/06/11 Python
利用Pycharm + Django搭建一个简单Python Web项目的步骤
2020/10/22 Python
利用css3 translate完美实现表头固定效果
2017/02/28 HTML / CSS
日本运动品牌美津浓官方购物网站:MIZUNO SHOP
2016/08/21 全球购物
母亲节演讲稿范文
2014/01/02 职场文书
写给女朋友的道歉信
2014/01/08 职场文书
2014年幼儿园园长工作总结
2014/12/17 职场文书
2016年大学生暑期社会实践方案
2015/11/26 职场文书
Nginx+SpringBoot实现负载均衡的示例
2021/03/31 Servers
python实现剪贴板的操作
2021/07/01 Python