sql语句不能使用别名作为where条件及解决办法

项目中需要查询一个完成度大于60%的数据,需要2列数据做一个计算后根据结果排序。

如果使用别名会报错,字段pct不存在。

因为sql的执行顺序,是在where后 order by之前加的别名,及生成结果集后加别名,where是生成结果集之前的操作,order by 是生成结果集后的操作,因为where要生成结果集,而order by 是对结果集操作。

使用派生表解决:

select * from
(
 select total as A, nums as B... from tablename
) aaa
where A=1 
order by A

 

 

使用别名会报错:

//完成度, $complete_percent=60
$fields = '*';
if($complete_percent != ''){
	$fields = '*,((total-surplus)/total) as pct';
        $map['pct'] = ['pct', 'gt', $complete_percent/100]
}

$list = $model->field($fields)
	->where(array_values($map))
	->order($_order,$_sort)
	->paginate($pagesize);

 

正确的姿势:

//完成度, $complete_percent=60
$fields = '*';
if($complete_percent != ''){
	$fields = '*,((total-surplus)/total)';
}

$list = $model->field($fields)
	->where(array_values($map))
	->where(function ($query) use($complete_percent){
		if($complete_percent != ''){
			$query->where('((total-surplus)/total) > '.($complete_percent/100) );
		}
	})
	->order($_order,$_sort)
	->paginate($pagesize);

 

 

make:

https://blog.csdn.net/weixin_33816946/article/details/92052266