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 控制器中代码如下:

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是在查询已经产生的结果集中进行筛选。这二个方法执行的对象和时机是不同的,请注意区别。

php having,having方法相关推荐

  1. 在 Oracle Enterprise Linux 和 iSCSI 上构建您自己的 Oracle RAC 11g 集群

    作者:Jeffrey Hunter 了解如何以低于 2,700 美元的费用在 Oracle Enterprise Linux 上安装并配置 Oracle RAC 11g 第 2 版开发集群. 本指南中 ...

  2. Java面试题大全2021版

    一.Java 基础 JDK 和 JRE 有什么区别? JDK:Java Development Kit 的简称,java 开发工具包,提供了 java 的开发环境和运行环境. JRE:Java Run ...

  3. Kotlin协程使用,协程使用注意事项,协程中的await方法使用|不使用suspend使用协程

    参见 码云 协程使用方法一 (Dispatchers调度器模式) 指定不同线程.同线程会挂起并阻塞(挂起是不影响主线程执行,阻塞是同样的IO线程会阻塞) withContext(Dispatchers ...

  4. IDEA中将代码块封装为方法,IDEA代码重构快捷键

    IDEA中将代码块封装为方法 选中要转换的代码块,快捷键: Windows快捷键:Alt + Shift + M Mac快捷键:Alt + Command + M 如图:

  5. IDEA自动生成对象所有set方法

    idea中有一款插件能够生成对象所有的set方法,GenerateAllSetter :下载地址 步骤1:将下载好的压缩包放在自己记得的文件夹中,在idea中进行导入 步骤2:在本地选中刚才的压缩包, ...

  6. List元素互换,List元素转换下标,Java Collections.swap()方法实例解析

    Java Collections.swap()方法解析 jdk源码: public static void swap(List<?> list, int i, int j) {// ins ...

  7. java1.8新增超实用Map方法——Map.getOrDefault()和Map.value()方法详解

    1. Map.getOrDefault() 翻译一下官方解释: java.util.Map<K, V> V getOrDefault(Object key, V defaultValue) ...

  8. spring boot项目 中止运行 最常用的几种方法

    spring boot项目 中止运行 最常用的几种方法: 1. 调用接口,停止应用上下文 @RestController public class ShutdownController impleme ...

  9. Java Calendar.add()方法的使用,参数含义。指定时间差。

    cal.add()方法中的参数含义: 第一个参数如果是1则代表的是对年份操作,2是对月份操作,3是对星期操作,5是对日期操作,11是对小时操作,12是对分钟操作,13是对秒操作,14是对毫秒操作. 第 ...

  10. 设置select下拉框不可修改的→“四”←种方法

    设置select下拉框为不可修改的几种方法: 因为select的特殊性,导致它不能像input表单一样简单地设置一个readonly来限制修改,所以,我们需要进行别的操作! 1.为下拉框添加样式,可以 ...

最新文章

  1. android软件安全权威指南 pdf_AV-TEST 发布 2019 最佳 Android 安全软件榜单
  2. python教程:mixin详解
  3. x86汇编指令集大全
  4. Leetcode1143. 最长公共子序列(c#)
  5. SICP~计算机程序的构造和解释~ 1.12 c++实现
  6. python:No module named ‘pywt‘解决办法
  7. Visual Studio下的PHP开发工具VS.PHP初探
  8. python编程入门指南-Python编程入门指南(上下册)
  9. HTML - 布局div
  10. TUIO - Radar - Unity
  11. 如何卸载快压病毒流氓软件--不停自动下载安装App
  12. PCM开发板模块实验指导--2.4G无线通讯模块NRF24L01实验
  13. 删除自定义reg注册表
  14. python机器人库(robotics-toolbox-python)的运用
  15. 人生没有白读的书,每一本都算数~
  16. 全宇宙最强AI 聊天机器人模型ChatGPT惊艳来袭,你还不上车?居然能写演讲稿和帮忙写代码
  17. 赛事启动 |香港科大-杰瑞集团 2022【人工智能】百万奖金国际创业大赛
  18. input如何设置默认值
  19. 2017年2月28日 星期二 --出埃及记 Exodus 23:18
  20. android基础回顾(三)

热门文章

  1. 前端基础-CSS的各种选择器的特点以及CSS的三大特性
  2. layui 子页面写弹出框覆盖父页面,以及给弹框中的表单赋值
  3. 39.数组中数值和下标相等的元素
  4. vscode 编辑器常用快捷键
  5. Deepin安装Curl的方法
  6. How to check bad fix
  7. SP2010开发和VS2010专家食谱--第三章节--高级工作流(2)--为沙盒解决方案创建自定义活动...
  8. 浙大计算机专硕培养方案,浙江大学硕士研究生培养方案
  9. java web转码_javaweb后台转码
  10. c语言入门经典案例,c语言入门经典案例及飞源代码.doc