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

例(假设):

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. NAND FLASH驱动框架以及程序实现

    1.NAND FLASH的硬件连接: 实验用的NAND FLASH芯片为K9F2G08U0C,它是三星公司的存储芯片,它的大小为256M.它的接线图如下所示: 它的每个引脚的分别为LDATA0-LDA ...

  2. Microsonf visual c++ 14+ 离线内网安装

    内网离线安装方法:先下载官方的visualcppbuildtools: <br  href=http://go.microsoft.com/fwlink/?LinkId=691126 >& ...

  3. 如何着手学习WebRTC开发(转)

    文章链接:http://www.sohu.com/a/146536246_458408 WebRTC中文社区-国内镜像:https://webrtc.org.cn/mirror/#windows%E2 ...

  4. python之路之html

    def index(request): print request.POST print request.GET print request.FILES for item in request.FIL ...

  5. 2.(group by)如何让分组后,每组中的数据按时间倒序排列(group by和 order by的分组按排列)

    比如说有表devicedata: 问题: 现在我想将devicedata这个表中的数据,先按device_id这个字段分组,然后每组中的数据按时间字段ts从大到小的排列, 如何解决呢? 错误的sql: ...

  6. AcWing 差分一维加二维

    一维 #include<bits/stdc++.h> using namespace std ; ; int n,m; int a[N],b[N]; //a为前缀和,b为差分 差分和前缀和 ...

  7. 题解【SP8002】HORRIBLE - Horrible Queries

    题面 题解 这是一道线段树的模板题. 题目需要我们维护一个支持区间修改.区间查询的一个数据结构,很容易想到线段树. 然后发现和洛谷上线段树的模板1是同一道题. 由于本题中每个数的初始值都为\(0\), ...

  8. BLUE引擎检查放入装备的名称全名脚本

    格式:CHECKDLGITEMNAME 名称 检查条件需要配合QUERYITEMDLG命令 ;========================================== [@main]#AC ...

  9. Git-配置SSH公钥

    前言:Git是分布式的代码管理工具,远程的代码管理是基于SSH的,所以要使用远程的Git则需要SSH的配置. 以下操作都在git-bash命令行中进行. 查看所有配置项: git config --l ...

  10. centos长ping输出日志的脚本

    为监控某服务器的网络情况,制作一个sh脚本,记录ping的长过程,并输出日志以备观察. 1.脚本如下 cat /home/summer/ping100.sh #!/bin/sh ping 172.16 ...