一、使用闭包构造子查询

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-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);

 

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

 

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


 

二、使用fetchSql方法

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

<?php
namespace app\index\controller;
//导入数据库类
use think\Db;

class Index {
public function index(){

//1.生成子查询:计算平均工资
$subQuery = Db::table('tp5_staff') //设置数据表
-> 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元

<?php
namespace app\index\controller;
//导入数据库类
use think\Db;

class Index {
public function index(){

//1.生成子查询:查询tp5_good表中good=1的员工id
$subQuery = Db::table('tp5_good') //设置数据表,不允许同表查询
-> 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​