前言[随时更新]
MySQL快速复习
MySQL原生查询
选择数据表
删除数据
聚合查询
时间查询
视图查询
子查询
总结/参考
学完前面的三种生成子查询语句的方法,闭包子查询就很简单了。闭包查询通常产生一个结果集,非常适合IN / NOT IN 或 EXISTS / NOT EXISTS 查询
优秀员工信息存放在tp5_good表中,需要在该表做子查询,先获取优秀员工id,我们用闭包匿名函数来实现来获取满足条件的数据表;然后再把这个数据列集合做为父查询的条件传入到 “IN” 子句就可以了。
<?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);
}
}
SELECT `id`,`name`,`salary` FROM `tp5_staff` WHERE `id` IN ( SELECT `id` FROM `tp5_good` WHERE `good` = 1 )
