Laravel项目中怎么对数据库进行子查询
Admin 2022-06-21 群英技术资讯 886 次浏览
关于“Laravel项目中怎么对数据库进行子查询”的知识有一些人不是很理解,对此小编给大家总结了相关内容,具有一定的参考借鉴价值,而且易于学习与理解,希望能对大家有所帮助,有这个方面学习需要的朋友就继续往下看吧。本项目中关联了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了一次,应该可以再优化一下.
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:mmqy2019@163.com进行举报,并提供相关证据,查实之后,将立刻删除涉嫌侵权内容。
猜你喜欢
模板引擎是联系界面和业务这两部分的“桥梁”,可理解成一个PHP类,里面定义了许多方法,实现了将PHP的原始输出加载上界面样式后再输出。
/path/to/pkphp.com/script.php?ajax 在php脚本中使用如下方法判断: 代码如下: if(isset($_GET['ajax'])){ ...这是一个ajax请求,然后... }&nb...
MySQL应用中使用XOR运算加密算法的具体方式是怎么样的呢?而这篇内容中,小编将为大家介绍关于用异或(XOR)运算加密/解密算法的原理和实现方式,感兴趣的朋友可以跟着小编继续往下了解。
正在学习swoole的协程中,协程的特点是看起来象是并发执行。试验一下。本文前提,linux上已安装了swoole。目前的最新版是 4.5.9(2020-12-17) 构造一个需求,一下创建5个协程,每个协程休眠1到3秒之间的随机数,然...
今天小编就为大家分享一篇关于phpinfo无法显示的原因及解决办法,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
成为群英会员,开启智能安全云计算之旅
立即注册关注或联系群英网络
7x24小时售前:400-678-4567
7x24小时售后:0668-2555666
24小时QQ客服
群英微信公众号
CNNIC域名投诉举报处理平台
服务电话:010-58813000
服务邮箱:service@cnnic.cn
投诉与建议:0668-2555555
Copyright © QY Network Company Ltd. All Rights Reserved. 2003-2020 群英 版权所有
增值电信经营许可证 : B1.B2-20140078 粤ICP备09006778号 域名注册商资质 粤 D3.1-20240008