## 閉包子查詢
>[info] 學完前面的三種生成子查詢語句的方法,閉包子查詢就很簡單了。閉包查詢通常產生一個結果集,非常適合IN / NOT IN 或 EXISTS / NOT EXISTS 查詢
### 實例演示:
#### 任務1:查詢tp5_staff表中優秀員工的基本信息(id,name,salary)
>[info] 優秀員工信息存放在tp5_good表中,需要在該表做子查詢,先獲取優秀員工id,我們用閉包匿名函數來實現來獲取滿足條件的數據表;然后再把這個數據列集合做為父查詢的條件傳入到 “IN” 子句就可以了。
* 下面是Index.php 控制器的代碼:
~~~
<?php
namespace app\index\controller;
//導入數據庫類
use think\Db;
class Index {
public function index(){
//1.生成子查詢閉包:查詢tp5_good表中good=1的員工id
$subQuery = function($query){
$query -> table('tp5_good') //設置數據表,不允許同表查詢
-> field('id') //字段必須與父查詢的條件字段一致
-> where('good','=',1); //設置子查詢條件:good = 1 即優秀
};
//2.執行父查詢:將子查詢
$result = Db::table('tp5_staff') //設置數據表
-> field('id,name,salary') //設置結果集字段列表
-> where('id','in',$subQuery) //將子查詢閉包傳給父查詢字段IN條件
-> select(); //獲取結果集
//3.查看結果
dump($result);
}
}
~~~
* 對應生成的SQL語句:
~~~
SELECT `id`,`name`,`salary` FROM `tp5_staff` WHERE `id` IN ( SELECT `id` FROM `tp5_good` WHERE `good` = 1 )
~~~
* 由于生成的數據較多,我們就直接在SQLPRO中看結果了:

- 前言[隨時更新]
- ThinkPHP 5數據庫重構
- 開發環境
- 1.ThinkPHP5開發環境(Mac版)
- 2.ThinkPHP5開發環境(Win版)
- MySQL快速復習
- 1.數據庫操作
- 2.數據表操作
- 1.創建數據表 (重點)
- 2.添加數據表記錄
- 3.查詢數據表(重點)
- 4.更新數據表
- 5.編輯數據表結構(重點)
- 6_復制數據表
- 7.刪除數據和表
- 連接數據庫
- 1.數據庫配置文件database.php
- 2.Db類靜態方法connect()
- 3.模塊中的配置文件config.php
- MySQL原生查詢
- 1.讀操作query
- 2.寫操作execute
- 選擇數據表
- 1.table與setTable方法
- 2.name方法
- 3.db助手函數
- 4.alias方法
- 結果集查詢
- 1.find方法
- 2.select方法
- 3.fetchSql方法
- 4.value方法
- 5.column方法
- 6.field方法
- 新增數據
- 1.insert_單條添加
- 2.insertAll_批量添加
- 3_db_助手函數添加
- 更新數據
- 1.update方法
- 2.setField更新字段
- 3_自增自減與延時更新
- 刪除數據
- 1.delete方法
- 查詢方法
- 1.getTableInfo方法
- 2.where方法
- 3.whereOr方法
- 4.混合查詢(閉包實現)
- 表達式查詢
- 1.表達式查詢(重點)
- 2.exp通用查詢
- 分組查詢
- 1.group方法
- 2.having方法
- 排序分頁查詢
- 1.order方法
- 2.limit方法
- 3.page方法
- 聚合查詢
- 時間查詢
- 1.where方法
- 2.whereTime方法
- 高級查詢
- 1.快捷查詢
- 2.區間查詢
- 3.批量查詢
- 4.Query對象查詢
- 5.混合查詢
- 視圖查詢
- view方法
- 子查詢
- 1.select方法
- 2.fetchSql方法
- 3.buildSql方法
- 4.閉包子查詢
- 總結/參考
- 1.方法參數類型總結
- 2.查詢/子查詢/連接查詢