前言

本文实现的这个需求其实十分普遍,举例来说,我们存在一个用户来源表,用来标记用户从哪个渠道注册进来。表结构如下所示…

其中 origin 是用户来源,其中的值有 iPhone 、Android 、Web 三种,现在需要分别统计由这三种渠道注册的用户数量。

解决方案1

1
2
3
4
5
6
7
8
9
SELECT count(*)
FROM user_operation_log
WHERE origin = 'iPhone';
SELECT count(*)
FROM user_operation_log
WHERE origin = 'Android';
SELECT count(*)
FROM user_operation_log
WHERE origin = 'Web';

用 where 语句分别统计各自的数量。

这样查询的量有点多了,如果这个值有 10 个呢,那还得写 10 条相似的语句,很麻烦。

有没有一条语句就搞定的呢?于是去查了些资料。

解决方案2

我们知道 count 不仅可以用来统计行数,也能统计列值的数量,例如:

统计 user_operation_log 有多少行:

1
SELECT count(*) FROM user_operation_log

统计 origin 这列值不为 NULL 的数量:

1
SELECT count(origin) FROM user_operation_log

所以我们可以利用这个特性来实现上面的需求

第一种写法(用 count 实现)

1
2
3
4
5
SELECT
 count(origin = 'iPhone' OR NULL) AS iPhone,
 count(origin = 'Android' OR NULL) AS Android,
 count(origin = 'Web' OR NULLAS Web
FROM user_operation_log;

查询结果

第二种写法(用 sum 实现)

1
2
3
4
5
SELECT
 sum(if(origin = 'iPhone', 1, 0)) AS iPhone,
 sum(if(origin = 'Android', 1, 0)) AS Android,
 sum(if(origin = 'Web', 1, 0))  AS Web
FROM user_operation_log;

查询结果

第三种写法(改写 sum)

1
2
3
4
5
SELECT
 sum(origin = 'iPhone') AS iPhone,
 sum(origin = 'Android') AS Android,
 sum(origin = 'Web'AS Web
FROM user_operation_log;

查询结果

第四种写法(来自掘金用户 杰夫 的答案)

1
SELECT origin,count(*) num FROM user_operation_log GROUP BY origin;

查询结果

至此,已经达到了我们的需求。

mysql查询相关问题的更多相关文章

  1. mysql查询相关的命令解析

    特:不重启mysql 更新配置文件方法(不允许重启mysql实例或连接不上msyql服务器): gdb -p $(pidof mysqld) -ex "set max_connections ...

  2. mysql查询相关

    查询事务 SELECT * FROM information_schema.INNODB_TRX\G; 查询正在锁的事务 SELECT * FROM INFORMATION_SCHEMA.INNODB ...

  3. mysql 查询相关命令

    1. 结果集按列展示 mysql  -u用户名  -p密码  -D 数据库名 -e  sql语句 示例:mysql   -uroot  -p123456  -D mysql -e select * f ...

  4. MySQL查询相关(初级)(全文重点)

    where 是约束条件 先找到表 from t1 where 条件 : 指的是把表里的数据,一条一条的记录取出来 然后 group by 分组, having 是过滤条件 指记录已经出来 聚合 cou ...

  5. 关于mysql,需要掌握的基础(一):CRUD、存储引擎、单表查询相关、多表查询join、事务并发、权限管理等等

    目录 关于mysql,需要掌握的基础(一): 1.了解数据库sql.数据库系统.数据库管理系统的概念. 2.了解DDL.DML.DQL语句是什么? 3.了解存储引擎.存储引擎[InnoDB 和 MyI ...

  6. MySQl 查询性能优化相关

    0. 1.参考 提升网站访问速度的 SQL 查询优化技巧 缓存一切数据,读取内存而不是硬盘IO 如果你的服务器默认情况下没有使用MySQL查询缓存,那么你应该开启缓存.开启缓存意味着MySQL 会把所 ...

  7. 使用MySQL客户端登录Ensemble数据库查询相关信息

    Ensemble公共MySQL数据库 对于大量数据和更详细的分析,Ensemble的MySQL服务器ensembldb.ensembl.org,useastdb.ensembl.org或asiadb. ...

  8. Mysql查询——学习阶段

    1.开篇 搞开发的都知道,当数据量很大的时候,我们的代码逻辑的简单性就显得十分重要,否则处理起来就需要花费相当多的时间.另外还有一个地方需要注意的是我们写的sql语句. 一个拥有多年开发的资深开发者可 ...

  9. Mysql 查询练习

    Mysql 查询练习 ---创建班级表 create table class( cid int auto_increment primary key, caption ) )engine=innodb ...

随机推荐

  1. 实力封装:Unity打包AssetBundle(三)

    前情提要:第二种打包方式 窗口初现 通过前面的两篇教程和一篇番外,我们已经完全实现了打包的功能.但是使用起来总是觉得有些晦涩别扭,如果不告诉别人怎么使用,对方肯定是一头雾水. What?你给我的这是啥 ...

  2. php优秀框架codeigniter学习系列——安装,配置

    下载 可在官网下载,我使用的是CodeIgniter-3.1.7. 目录 打开程序目录,可看到目录结构. 我这里做一点小的修改,新建了一个 index 目录,将 index.php 和一些静态文件放入 ...

  3. 创建vue项目

    1.创建项目 vue creat 项目名 // 要提前进入目标目录(项目应该创建在哪个目录下) // 选择自定义方式创建项目,选取Router, Vuex插件 2.启动/停止项目 npm run se ...

  4. python 时间戳算法

    根据当前时间戳获得整小时时间戳 unit = 3600 start_time = int(time.time())/3600 * 3600 根据当前时间戳获得整天时间戳 unit = 3600*24 ...

  5. Mac 终端添加代码到SVN

    从SVN拉取代码步骤: 1.cd  /Users/mark/zkh/Work/BC/(本地路径) 2.svn checkout  https://192.168.2.99/svn/bc_android ...

  6. Unity 3D第三人称视角、用途广泛限定角度(视角不能360度翻转)

    Unity第三人称相机视角控制 本文提供全流程,中文翻译. Chinar 坚持将简单的生活方式,带给世人!(拥有更好的阅读体验 -- 高分辨率用户请根据需求调整网页缩放比例) Chinar -- 心分 ...

  7. CH0101 a^b、 CH0102 64位整数乘法(快速幂、快速乘)【模板题】

    题目链接:传送门    //a^b   传送门    //64位整数乘法 题目: 描述 求 a 的 b 次方对 p 取模的值,其中 ≤a,b,p≤^ 输入格式 三个用空格隔开的整数a,b和p. 输出格 ...

  8. 杜教BM

    #include <algorithm> #include <iterator> #include <iostream> #include <cstring& ...

  9. 【BZOJ3672】【UOJ#6】【NOI2014】随机数生成器

    暴力出奇迹 原题: 2≤N,M≤5000 0≤Q≤50000 0≤a≤300 0≤b,c≤108 0≤x0<d≤108 1≤ui,vi≤N×M 恩首先容易看出来这个棋盘直接模拟搞出来就行了,不用 ...

  10. cdcq的独立博客上线辣!-> http://cdcq.coding.me/blog/

    cdcq的独立博客上线辣!-> http://cdcq.coding.me/blog/ 这个博客会逐渐停更 独立博客被硬盘保护吃掉了,直到省选前独立博客应该不会再上线 (如果没进队就永远不会上线 ...