欢迎您访问 最编程 本站为您分享编程语言代码,编程技术文章!
您现在的位置是: 首页

闭包子查询

最编程 2024-04-15 16:49:44
...

闭包子查询

学完前面的三种生成子查询语句的方法,闭包子查询就很简单了。闭包查询通常产生一个结果集,非常适合IN / NOT IN 或 EXISTS / NOT EXISTS 查询

实例演示:

任务1:查询tp5_staff表中优秀员工的基本信息(id,name,salary)

优秀员工信息存放在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中看结果了: