關(guān)于laravel 子查詢 & join的使用
本項(xiàng)目中關(guān)聯(lián)了2個(gè)數(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, ], ],
在某個(gè)需求中,需要使用子查詢獲取snapshot快照表庫的關(guān)聯(lián)數(shù)據(jù),從而實(shí)現(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語句會(huì)只有'?' ->get();
而join語句中可傳入匿名函數(shù)重新構(gòu)造,如再其中加多幾個(gè)連接條件,或者查詢條件
$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'; })
實(shí)現(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)容了,希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
采用ThinkPHP中F方法實(shí)現(xiàn)快速緩存實(shí)例
一般使用文件方式的緩存就能夠滿足要求,而thinkPHP還提供了一個(gè)專門用于文件方式的快速緩存方法F方法,需要的朋友可以參考下2014-06-06php控制linux服務(wù)器常用功能 關(guān)機(jī) 重啟 開新站點(diǎn)等
服務(wù)器主機(jī)是CentOS 的,每次重啟、關(guān)機(jī)都得通過客戶端連接,想問下能否通過PHP頁面實(shí)現(xiàn)對(duì)系統(tǒng)的 關(guān)機(jī)、重啟操作2012-09-09Swoole-1.7.22 版本已發(fā)布,修復(fù)PHP7相關(guān)問題
swoole-1.7.22 版本已發(fā)布,此版本是一個(gè)BUG修復(fù)版本,專門針對(duì)PHP7做了大量修改,可完美運(yùn)行于PHP7環(huán)境2015-12-12打造超酷的PHP數(shù)據(jù)餅圖效果實(shí)現(xiàn)代碼
打造超酷的PHP數(shù)據(jù)餅圖效果實(shí)現(xiàn)代碼,比較適合做統(tǒng)計(jì)效果輸出,需要的朋友可以參考下。很多年前的代碼。2011-11-11Laravel程序架構(gòu)設(shè)計(jì)思路之使用動(dòng)作類
這篇文章主要給大家介紹了關(guān)于Laravel程序架構(gòu)設(shè)計(jì)思路之使用動(dòng)作類的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2018-06-06