## 闭包子查询
>[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)
- 前言[随时更新]
- 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.查询/子查询/连接查询