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

有方法

最编程 2024-03-19 08:58:54
...
    • having方法
      • 1、对分组统计的结果,进行筛选
      • 2、源码:/thinkphp/library/think/db/Query.php
      • 3、参数与返回值
      • 4、实例演示
      • 总结:

having方法

1、对分组统计的结果,进行筛选

如果将分分组查询的结果看成一张表的话,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;
    }

源码非常简单,就是给Query类的查询选项属性options[ 'having' ] 赋值

3、参数与返回值

  • 参数

如果把分组查询结果看作一张新数据表的话,having就相当于该表的where操作。同理,这个“新表”中应该只有分组字段和统计字段(由聚合函数计算得到的值组成的字段)。我们having方法,就是在统计字段中,找出符合条件的记录:如平均值大于500之类的条件。

序号 参数 说明
1 聚合函数组成的运算表达式 从统计查询结果是,筛选出符合条件的记录

having方法与where方法都可以设置查询条件,但二者使用是有区别的:
 (1) where方法中的字段,必须是表中实际真实存在的字段
 (2) having方法中的定段,不一定是表中实际字段,只要是select语句可以查询或计算出来的表达式都可以,例如拼接字段名、数值型字段的算术运算、统计类聚合函数等;换句话说,having 中的字段,必须在select后面的字段列表中出现。

  • 返回值:与其它方法一样,返回查询对象本身,便于后面访问调用

4、实例演示


  • 任务1:查询tp5_staff表中,各部门的平均工资大于6400元的员工信息


    该实例是前面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)
  }
}

可以看到,原来的市场部平均工资数据消失了,因为他的平均工资不到6400

  • 生成的SQL语句如下:
SELECT `dept` AS `部门`,ROUND(AVG(salary),2) AS `平均工资` FROM `tp5_staff` GROUP BY dept HAVING avg(salary) > 6400
  • 表中数据如下:

总结:

having条件与where条件非常相似,但又有本质不同。where是根据某列特征进行查询,而having是在查询已经产生的结果集中进行筛选。这二个方法执行的对象和时机是不同的,请注意区别。

推荐阅读