首先構造子查詢SQL,可以使用下面三種的方式來構建子查詢。
?
## 使用`fetchSql`方法
?
fetchSql方法表示不進行查詢而只是返回構建的SQL語句,并且不僅僅支持`select`,而是支持所有的CURD查詢。
~~~
$subQuery = Db::table('think_user')
->field('id,name')
->where('id', '>', 10)
->fetchSql(true)
->select();
~~~
?
生成的subQuery結果為:
~~~sql
SELECT `id`,`name` FROM `think_user` WHERE `id` > 10
~~~
?
## 使用`buildSql`構造子查詢
~~~
$subQuery = Db::table('think_user')
->field('id,name')
->where('id', '>', 10)
->buildSql();
~~~
?
生成的subQuery結果為:
~~~sql
( SELECT `id`,`name` FROM `think_user` WHERE `id` > 10 )
~~~
?
調用`buildSql`方法后不會進行實際的查詢操作,而只是生成該次查詢的SQL語句(為了避免混淆,會在SQL兩邊加上括號),然后我們直接在后續的查詢中直接調用。
?
然后使用子查詢構造新的查詢:
~~~
Db::table($subQuery . ' a')
->where('a.name', 'like', 'thinkphp')
->order('id', 'desc')
->select();
~~~
?
生成的SQL語句為:
~~~sql
SELECT * FROM ( SELECT `id`,`name` FROM `think_user` WHERE `id` > 10 ) a WHERE a.name LIKE 'thinkphp' ORDER BY `id` desc
~~~
?
## 使用閉包構造子查詢
?
`IN/NOT IN`和`EXISTS/NOT EXISTS`之類的查詢可以直接使用閉包作為子查詢,例如:
?
~~~
Db::table('think_user')
->where('id', 'IN', function ($query) {
$query->table('think_profile')->where('status', 1)->field('id');
})
->select();
~~~
?
生成的SQL語句是
~~~sql
SELECT * FROM `think_user` WHERE `id` IN ( SELECT `id` FROM `think_profile` WHERE `status` = 1 )
~~~
?
~~~
Db::table('think_user')
->whereExists(function ($query) {
$query->table('think_profile')->where('status', 1);
})->find();
~~~
生成的SQL語句為
~~~
SELECT * FROM `think_user` WHERE EXISTS ( SELECT * FROM `think_profile` WHERE `status` = 1 )
~~~
?
> 除了上述查詢條件外,比較運算也支持使用閉包子查詢
- 簡介
- 數據庫配置
- 分布式數據庫
- 查詢構造器
- 查詢數據
- 新增數據
- 更新數據
- 刪除數據
- 鏈式操作
- Where
- Table
- Alias
- Field
- Strict
- Limit
- Page
- Order
- Group
- Having
- Join
- Union
- Distinct
- Lock
- Cache
- Comment
- FetchSql
- Force
- Partition
- Replace
- FailException
- Extra
- Duplicate
- Sequence
- Procedure
- View
- 聚合查詢
- 分頁查詢
- 時間查詢
- 高級查詢
- 子查詢
- 原生查詢
- 事務操作
- 存儲過程
- 查詢事件
- JSON字段
- 模型
- 定義
- 新增
- 更新
- 刪除
- 查詢
- 查詢范圍
- 只讀字段
- JSON字段
- 自動時間寫入
- 獲取器
- 修改器
- 搜索器
- 類型轉換
- 模型輸出
- 模型事件
- 虛擬模型
- 關聯
- 一對一關聯
- 一對多關聯
- 遠程一對多
- 遠程一對一
- 多對多關聯
- 多態一對多
- 多態一對一
- 關聯預載入
- 關聯統計
- 關聯輸出
- SQL監聽
- 緩存機制
- 字段緩存
- 查詢緩存
- 擴展
- 自定義查詢類
- 自定義數據庫驅動