tp5.1 子查询SQL 查询语句中再包涵查询语句闭包查询 带分页

一、使用闭包构造子查询

1-1、带变量查询

带变量,要加use ($teachers_id)

->where('id', 'IN', function ($query) use ($teachers_id) {

        //老师课程
        $list=Db::name('product')
		//查询点播的课程
	    ->where('id', 'IN', function ($query) use ($teachers_id) {
	        $query->name('product')
	        ->alias('p1')       
	        ->leftJoin('admin a',"p1.teachers_id = a.id")
	        ->where('p1.teachers_id',$teachers_id)
		    ->where('p1.type', 1)//1为虚拟物品不用寄
		    ->where('p1.deleted', 0)
		    ->where('a.deleted', 0)
		    ->where('p1.type_mold', 2)//点播
		    ->field('p1.id');
	    })
	   //查询直播的课程
        ->whereor('id', 'IN', function ($query) use ($teachers_id)  {
            $query->name('product')
            ->alias('p2')    
            ->leftJoin('class c',"p2.id = c.pid")
            ->where('p2.deleted', 0)
            ->where('c.deleted',0)
            ->where('c.teachers_id',$teachers_id)
            ->whereNotNull('c.pid')
            ->field('p2.id');
        })
        ->where('type',1)//类型 1为虚拟物品不用寄 2为实物需要寄出
        ->whereIn('type_mold','1,2')
        ->where('deleted',0)
        ->order('id desc')
        ->paginate(12,false,['query' => request()->param(),'type' => 'page\Page','var_page'  => 'page']);
		  $page = $list->render();

tp5.1 子查询SQL 查询语句中再包涵查询语句闭包查询 带分页_第1张图片

 

1-2、不能带变量查询

1、一个条件查询:

例子:SELECT * FROM `think_user` WHERE `id` IN ( SELECT `id` FROM `think_profile` WHERE `status` = 1 )

Db::table('think_user')
    ->where('id', 'IN', function ($query) {
        $query->table('think_profile')->where('status', 1)->field('id');
    })
    ->select();
Db::name('user')
    ->where('id', 'IN', function ($query) {
        $query->name('profile')->where('status', 1)->field('id');
    })
    ->select();

2、多个条件查询:带分页

说明:查询符合where('type', 0)->where('deleted', 0)条件的数据和符合另一个条件的记录集

			$rsn = Db::name('notice')
			    ->field('id,title,time,state')
			    ->where('id', 'IN', function ($query) {
			        $query->name('notice')->where('type', 0)->where('deleted', 0)->field('id');
			    })
			    ->whereor('id', 'IN', function ($query) {
			        $query->name('notice')
			        ->alias('n')
			        ->join('notice_user u',"n.id = u.nid")
			        ->where('u.user_id','<>',0)
			        //->where('u.user_id',$uid)
			        ->where('n.type', 1)
			        ->where('n.deleted', 0)
			        ->field('n.id');
			    })
			    ->order('state desc,id desc')
			    ->paginate(5,false,['query' => request()->param(),'type' => 'page\Page','var_page'  => 'page']);
			    $this->assign('rsn',$rsn);

tp5.1 自定义分页Page.php :https://blog.csdn.net/haibo0668/article/details/82772147

 

子查询SQ 官方文档:https://www.kancloud.cn/manual/thinkphp5_1/354032

 

TP5 Join 多条件 :https://blog.csdn.net/haibo0668/article/details/82918002

TP5.1 闭包查询WHERE ( 查询条件1 OR 查询条件2 ) OR ( 查询条件3 OR 查询条件4 )

https://blog.csdn.net/haibo0668/article/details/81563700

 

二、使用fetchSql方法

1、任务1:我们仍以上节课案例为讲,查询工资大于平均数的员工信息

 field('avg(salary)')   //字段列表可以使用聚合函数
                -> fetchSql(true) //true:不执行查询,返回SQL语句 ,false:忽略,继续执行查询
                -> select();   //此时select并不会执行


    //2.执行父查询:获取大于平均工资的员工信息
      $result = Db::table('tp5_staff')   //设置数据表
              -> field('id,name,salary')  //设置查询字段列表
              -> where('salary >= '.'('.$subQuery.')')  //将子查询结果传给父查询
              -> select();    //执行查询获取结果集

      //3.查看结果
      dump($result);
  }
}

2、给tp5_staff表中优秀员工加薪500元

 field('id')   //字段必须与父查询的条件字段一致
                -> where('good','=',1)  //设置子查询条件:good = 1 即优秀
                -> fetchSql(true) //true:不执行查询,返回SQL语句 ,false:忽略,继续执行查询
                -> select();   //此时select并不会执行


    //2.执行父查询:给优秀员工加薪500
      $affected = Db::table('tp5_staff')   //设置数据表
              -> where('id in '.'('.$subQuery.')')  //将子查询结果传给父查询字段IN条件
              -> update(['salary'=>['exp','salary + 500']]);  //更新成功则返回影响记录数量

      //3.查看结果
      dump($affected);    // int(6) : 有6条记录被更新
  }
}

转载:http://www.php.cn/php/php-fetchSql-method.html

 

 

 

 

你可能感兴趣的:(thinkphp5)