## 闭包子查询 >[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中看结果了: ![](https://box.kancloud.cn/756fd72beb23bd5bd6859593fb61462c_1066x775.png)