關(guān)于laravel 子查詢 & join的使用
本項(xiàng)目中關(guān)聯(lián)了2個(gè)數(shù)據(jù)庫(kù)
'default' => env('DB_CONNECTION', 'mysql'), //默認(rèn)使用mysql為連接庫(kù)
'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快照表庫(kù)的關(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語(yǔ)句
$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語(yǔ)句會(huì)只有'?'
->get();
而join語(yǔ)句中可傳入匿名函數(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的使用就是小編分享給大家的全部?jī)?nèi)容了,希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
采用ThinkPHP中F方法實(shí)現(xiàn)快速緩存實(shí)例
一般使用文件方式的緩存就能夠滿足要求,而thinkPHP還提供了一個(gè)專門用于文件方式的快速緩存方法F方法,需要的朋友可以參考下2014-06-06
Linux下PHP連接Oracle數(shù)據(jù)庫(kù)
PHP連接Oracle是通過(guò)oci8訪問(wèn)的。需要在web服務(wù)器上安裝oracle-instantcilent,使PHP支持Oracle擴(kuò)展包OCI。下面我們來(lái)一步步詳細(xì)介紹下如何使用PHP連接Oracle。2014-08-08
php控制linux服務(wù)器常用功能 關(guān)機(jī) 重啟 開新站點(diǎn)等
服務(wù)器主機(jī)是CentOS 的,每次重啟、關(guān)機(jī)都得通過(guò)客戶端連接,想問(wèn)下能否通過(guò)PHP頁(yè)面實(shí)現(xiàn)對(duì)系統(tǒng)的 關(guān)機(jī)、重啟操作2012-09-09
解決laravel 表單提交-POST 異常的問(wèn)題
今天小編就為大家分享一篇解決laravel 表單提交-POST 異常的問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2019-10-10
Swoole-1.7.22 版本已發(fā)布,修復(fù)PHP7相關(guān)問(wè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-11
Laravel程序架構(gòu)設(shè)計(jì)思路之使用動(dòng)作類
這篇文章主要給大家介紹了關(guān)于Laravel程序架構(gòu)設(shè)計(jì)思路之使用動(dòng)作類的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2018-06-06

