關(guān)于laravel 子查詢 & join的使用
本項目中關(guān)聯(lián)了2個數(shù)據(jù)庫
'default' => env('DB_CONNECTION', 'mysql'), //默認(rèn)使用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快照表庫的關(guān)聯(lián)數(shù)據(jù),從而實現(xiàn)以下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()) // 綁定參數(shù),否則sql語句會只有'?'
->get();
而join語句中可傳入匿名函數(shù)重新構(gòu)造,如再其中加多幾個連接條件,或者查詢條件
$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';
})
實現(xiàn)上述需求完整代碼如下:
$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了一次,應(yīng)該可以再優(yōu)化一下.
以上這篇關(guān)于laravel 子查詢 & join的使用就是小編分享給大家的全部內(nèi)容了,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
php+iframe實現(xiàn)隱藏?zé)o刷新上傳文件
首先ajax不能上傳文件,這誤導(dǎo)了我有段時間,今晚睡不著就照著說明做了個無刷新上傳文件2012-02-02
PHP經(jīng)典面試題之設(shè)計模式(經(jīng)常遇到)
php中設(shè)計模式非常多,但是設(shè)計模式在php面試題經(jīng)常會提到,本文主要給大家介紹php經(jīng)典面試題之設(shè)計模式,需要的朋友一起看看吧2015-10-10
zend框架實現(xiàn)支持sql server的操作方法
這篇文章主要介紹了zend框架實現(xiàn)支持sql server的操作方法,結(jié)合實例形式分析了zend框架的相關(guān)代碼修改、配置文件設(shè)置與相關(guān)問題注意事項,需要的朋友可以參考下2016-12-12
基于php設(shè)計模式中單例模式的應(yīng)用分析
本篇文章是對php設(shè)計模式中單例模式的應(yīng)用進行了詳細(xì)的分析介紹,需要的朋友參考下2013-05-05
laravel-admin利用ModelTree實現(xiàn)對分類信息的管理
這篇文章主要介紹了laravel-admin利用ModelTree實現(xiàn)對分類信息的管理,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-01-01

