[TOC]
## having方法
### 1、对分组统计的结果,进行筛选
>[info] 如果将分分组查询的结果看成一张表的话,having方法类似where语句的功能
### 2、源码:/thinkphp/library/think/db/Query.php
~~~
/**
* 指定having查询
* @access public
* @param string $having having
* @return $this
*/
public function having($having)
{
$this->options['having'] = $having;
return $this;
}
~~~
>[info] 源码非常简单,就是给Query类的查询选项属性options[ 'having' ] 赋值
### 3、参数与返回值
* 参数
>[info] 如果把分组查询结果看作一张新数据表的话,having就相当于该表的where操作。同理,这个“新表”中应该只有分组字段和统计字段(由聚合函数计算得到的值组成的字段)。我们having方法,就是在统计字段中,找出符合条件的记录:如平均值大于500之类的条件。
| 序号 | 参数 | 说明 |
| :---: | --- | --- |
| 1 | 聚合函数组成的运算表达式 | 从统计查询结果是,筛选出符合条件的记录 |
>[success] having方法与where方法都可以设置查询条件,但二者使用是有区别的:
> (1) where方法中的字段,必须是表中实际真实存在的字段
> (2) having方法中的定段,不一定是表中实际字段,只要是select语句可以查询或计算出来的表达式都可以,例如拼接字段名、数值型字段的算术运算、统计类聚合函数等;换句话说,having 中的字段,必须在select后面的字段列表中出现。
* 返回值:与其它方法一样,返回查询对象本身,便于后面访问调用
### 4、实例演示
* 任务1:查询tp5_staff表中,各部门的平均工资大于6400元的员工信息
>[info] 该实例是前面group方法的加强版,加了一个限定条件而已,请对照着看
* Index.php 控制器中代码如下:
~~~
<?php
namespace app\index\controller;
//导入数据库类
use think\Db;
class Index {
public function index(){
//查询部门的平均工资,小数保留2位
$result = Db::table('tp5_staff')
//字段名称中,可以使用聚合统计函数
-> field(['dept'=>'部门','ROUND(AVG(salary),2)'=>'平均工资'])
-> group('dept')
-> having('avg(salary) > 6400')
-> select();
//查看结果
dump($result);
}
~~~
* 查询结果如下:
~~~
array(2) {
[0] => array(2) {
["部门"] => string(9) "市场部"
["平均工资"] => float(9431.33)
}
[1] => array(2) {
["部门"] => string(9) "开发部"
["平均工资"] => float(6456.43)
}
}
~~~
>[warning] 可以看到,原来的市场部平均工资数据消失了,因为他的平均工资不到6400
* 生成的SQL语句如下:
~~~
SELECT `dept` AS `部门`,ROUND(AVG(salary),2) AS `平均工资` FROM `tp5_staff` GROUP BY dept HAVING avg(salary) > 6400
~~~
* 表中数据如下:
![](https://box.kancloud.cn/50e6d22202c2d59c84b3032b67cd315b_860x331.png)
### 总结:
>[warning] having条件与where条件非常相似,但又有本质不同。where是根据某列特征进行查询,而having是在查询已经产生的结果集中进行筛选。这二个方法执行的对象和时机是不同的,请注意区别。
- 前言[随时更新]
- ThinkPHP 5数据库重构
- 开发环境
- 1.ThinkPHP5开发环境(Mac版)
- 2.ThinkPHP5开发环境(Win版)
- MySQL快速复习
- 1.数据库操作
- 2.数据表操作
- 1.创建数据表 (重点)
- 2.添加数据表记录
- 3.查询数据表(重点)
- 4.更新数据表
- 5.编辑数据表结构(重点)
- 6_复制数据表
- 7.删除数据和表
- 连接数据库
- 1.数据库配置文件database.php
- 2.Db类静态方法connect()
- 3.模块中的配置文件config.php
- MySQL原生查询
- 1.读操作query
- 2.写操作execute
- 选择数据表
- 1.table与setTable方法
- 2.name方法
- 3.db助手函数
- 4.alias方法
- 结果集查询
- 1.find方法
- 2.select方法
- 3.fetchSql方法
- 4.value方法
- 5.column方法
- 6.field方法
- 新增数据
- 1.insert_单条添加
- 2.insertAll_批量添加
- 3_db_助手函数添加
- 更新数据
- 1.update方法
- 2.setField更新字段
- 3_自增自减与延时更新
- 删除数据
- 1.delete方法
- 查询方法
- 1.getTableInfo方法
- 2.where方法
- 3.whereOr方法
- 4.混合查询(闭包实现)
- 表达式查询
- 1.表达式查询(重点)
- 2.exp通用查询
- 分组查询
- 1.group方法
- 2.having方法
- 排序分页查询
- 1.order方法
- 2.limit方法
- 3.page方法
- 聚合查询
- 时间查询
- 1.where方法
- 2.whereTime方法
- 高级查询
- 1.快捷查询
- 2.区间查询
- 3.批量查询
- 4.Query对象查询
- 5.混合查询
- 视图查询
- view方法
- 子查询
- 1.select方法
- 2.fetchSql方法
- 3.buildSql方法
- 4.闭包子查询
- 总结/参考
- 1.方法参数类型总结
- 2.查询/子查询/连接查询