在网站开发的过程中,经常会用到数据统计功能,因此条件计数查询便是不可避免的,下面介绍几种方法来解决此问题。

例(假设):

mysql> select * from count_demo;
+-------+------+-----+
| class | pass | sex |
+-------+------+-----+
| 2 | 1 | 男 |
| 2 | 0 | 女 |
| 1 | 1 | 男 |
| 3 | 1 | 女 |
| 5 | 1 | 男 |
| 4 | 0 | 女 |
| 1 | 0 | 女 |
| 2 | 1 | 男 |
| 6 | 0 | 男 |
+-------+------+-----+ 9 rows in set

现有统计一个年级某项考试通过记录表如上(class代表班级,pass表示考试是否通过,1为通过,0为未通过,sex为性别)。

现在需要进行统计,每一个班级通过考试以及没有通过考试的人数。

方法一:使用OR NULL

mysql> select count(pass=1 or null) as pass,count(pass=0 or null) as no_pass,class from count_demo group by class;
+------+---------+-------+
| pass | no_pass | class |
+------+---------+-------+
| 1 | 1 | 1 |
| 2 | 1 | 2 |
| 1 | 0 | 3 |
| 0 | 1 | 4 |
| 1 | 0 | 5 |
| 0 | 1 | 6 |
+------+---------+-------+
6 rows in set

其中需要注意的是“or null”的使用,手册中提到 COUNT(column_name) 函数返回指定列的值的数目(NULL 不计入),那么如果pass不等于1的时候,or null就起作用,让条件为null,那么count就不会计算pass不为1的值。也即是正确的统计结果。(可自行去掉or null测试一下,得到的结果是错误的)

方法二:使用多条select

mysql> select count(pass) as pass,class from count_demo where pass=1 group by class;
+------+-------+
| pass | class |
+------+-------+
| 1 | 1 |
| 2 | 2 |
| 1 | 3 |
| 1 | 5 |
+------+-------+
4 rows in set
mysql> select count(pass) as pass,class from count_demo where pass=0 group by class;
+------+-------+
| pass | class |
+------+-------+
| 1 | 1 |
| 1 | 2 |
| 1 | 4 |
| 1 | 6 |
+------+-------+
4 rows in set

这样很直观也很简单,如果统计条件少,建议使用。

方法三:使用CASE WHEN

mysql> select count(case when pass=1 then 1 else null end)as pass,count(case when pass=0 then 1 else null end)as no_pass,class
from count_demo group by class; +------+---------+-------+
| pass | no_pass | class |
+------+---------+-------+
| 1 | 1 | 1 |
| 2 | 1 | 2 |
| 1 | 0 | 3 |
| 0 | 1 | 4 |
| 1 | 0 | 5 |
| 0 | 1 | 6 |
+------+---------+-------+
6 rows in set

CASE WHEN语句的功能很强大,可以定义灵活的查询条件,很适合进行分类统计。

mysql带条件的计数的更多相关文章

  1. mysql 带条件的sum/count 使用技巧

    本测试只是简单测试,其用途不在于代替count函数配合where函数进行聚合计算,而是在复杂查询中在sum/count中加入条件,一次性求出不同条件下的聚合结果. 1.插入测试数据如图 2.sum计算 ...

  2. mysq带条件的分页查询数据结果错误

    记一次mysql分页条件查询的结果出错: 以一张用户表为例,首先我们看表中的所有数据,注意红色框住的部分: 我们使用不带条件的分页查询来查询,数据显示是OK的: SELECT id,login_nam ...

  3. mysql 带外注入

    带外通道 有时候注入发现并没有回显,也不能利用时间盲注,那么就可以利用带外通道,也就是利用其他协议或者渠道,如http请求.DNS解析.SMB服务等将数据带出. payload SELECT LOAD ...

  4. springboot+thymeleaf+pageHelper带条件分页查询

    html层 <div> <a class="num"><b th:text="'共 '+ ${result.resultMap['pages ...

  5. Excel带条件求和——SUMIF函数

    老婆求帮忙,问Excel中怎么跨Sheet带条件求和,就是关于sheet2中筛选出来的数据自动合计在sheet3中 . 比如有个sheet2表中的数据如下: 现在要在sheet3中求合计, 通过分析可 ...

  6. Mariadb MySQL逻辑条件判断相关语句、函数使用举例介绍

    MySQL逻辑条件判断相关语句.函数使用举例介绍 By:授客 QQ:1033553122 1.  IFNULL函数介绍 IFNULL(expr1, expr2) 说明:假如expr1 不为NULL,则 ...

  7. laravel带条件查询手动分页

    后台php代码: //手动分页 $users = $kaoqin; //打算输出的数组,二维 $perPage = 10; if ($request->has('page')) { $curre ...

  8. laravel 带条件的分页查询

    laravel 带条件的分页查询, 原文:http://blog.csdn.net/u011020900/article/details/52369094 bug:断点查询,点击分页,查询条件消失. ...

  9. thinkphp 带条件分页查询

    thinkphp 带条件分页查询:form表单传值时候,method='get'. 用 get 传值

随机推荐

  1. ORA_12514:TNS:listener does not currently know of service requested in connect descriptor

    问题描述 ORA_12514:TNS:listener does not currently know of service requested in connect descriptor 解决方式 ...

  2. MyBatis使用步骤及原理

    主要讲解MyBatis-基本使用步骤      回顾:     MyBatis是一个数据持久层(ORM)框架.把实体 类和SQL语句之间建立了映射关系,是一种半自 动化的ORM实现.MyBATIS需要 ...

  3. 一个仿tp5分页组件的实现

    样式: a{ text-decoration: none; color: inherit; } .out-cp{ width:100%; text-align: center; } .c-page{ ...

  4. Java常量,变量,对象(字面量)在JVM内存中的存储位置

    Java常量,变量,对象(字面量)在JVM内存中的存储位置 2019-02-26 18:13:09 HD243608836 阅读数 540  收藏 更多 分类专栏: JAVA jvm   苦苦研究了快 ...

  5. HBase 中 Memstore-Local Allocation Buffer

    在0.90 版本后的 HBase,引入了一个高级机制用于缓解堆内存碎片的问题.此内存碎片问题的产生的主要原因是由于 memstore 上的扰动(频繁的分配与释放内存空间)导致.对应解决此问题的机制为M ...

  6. webpack4.41.0配置一(基础配置webpack文件,入口出口,实现打包)

    1.查看node.js版本.npm版本和webpack版本(使用webpack4时,请确保node.js的版本>=8.9.4) 2.我先重新卸载了webpack和webpack-cli(全局) ...

  7. git上传时出现ERROR: Repository not found.的解决办法

    今天在上传时出现错误,原因是之前更改了gitee上的个人空间地址,导致找不到.需要重新配置 https://gitee.com/help/articles/4114#article-header0

  8. (转)JSONObject的toBean 和 fromObject

    public static void main(String[] args) { Map map=new HashMap();map.put("我","妹"); ...

  9. 虚拟机安装的ubuntu不能联网解决

    安装双系统从没遇到的问题,再虚拟机上遇到了不能联网的问题: 下面给出我的解决方法(win10系统.ubuntu 16.04) 我的电脑-管理-设备管理器 看是否虚拟机的虚拟网卡在: 在去设置-控制面板 ...

  10. 主库增加表空间导致DG同步失败

    由于主库表空间不足,同事给表空间增加数据文件,第二天收到反馈说备库未同步. 1.主.备查看归档序列号,发现主.备归档正常同步. SQL>archive log list 2.在主库端查询v$ar ...