本篇文章小编给大家分享一下mysql中if函数使用方法,小编觉得挺不错的,现在分享给大家供大家参考,有需要的小伙伴们可以来看看。
具体场景如下,
先看看表结构:
CREATE TABLE `message` ( `id` varchar(30) NOT NULL, `title` varchar(30) DEFAULT NULL, `content` text, `send_time` datetime DEFAULT NULL, `type` int(1) DEFAULT NULL COMMENT '1:系统通知,2:投诉建议', `status` int(1) DEFAULT NULL COMMENT '0:待发送,1:成功,2:失败', PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
具体要求是:分别统计系统通知和投诉建议两种消息的总条数、成功条数和失败条数。
遇到这样的问题,我们一般的思路就是用type分组,分别查询系统通知和投诉建议的总条数,然后用两个子查询来统计成功条数和失败条数。sql如下:
SELECT COUNT(1) total, m.type, (SELECT COUNT(1) FROM message ms WHERE ms.status = 1 AND m.type = ms.type) successtotal, (SELECT COUNT(1) FROM message mf WHERE mf.status = 1 AND m.type = mf.type) failtotal FROM message m GROUP BY m.type
我们看看运行时间,统计1千万条数据大概需要6分18秒。
那么有没有更简单,更快的统计方式呢,当然是有的,就是我们今天主要讲的if()函数。
基本语法
IF(expr1,expr2,expr3),如果expr1的值为true,则返回expr2的值,如果expr1的值为false,则返回expr3的值。就是一个简单的三目表达式。
如何做
说说思路,假如我们统计成功条数,我们可以这样写if(status=1,1,0),这样如果status==1,则返回1,否则返回0。然后我们通过SUM()函数将成功条数相加即可。
实现方式
sql语句如下:
SELECT COUNT(1) total, m.type, SUM(IF(m.status = 1,1,0)) successtotal, SUM(IF(m.status != 1,1,0)) failtotal FROM message m GROUP BY m.type;
看着是不是比上面的子查询简洁多了,我们来看看运行时间,只有1分30秒。是不是快多了。
火柴人绳索英雄2无限金币版 (Stickman Rope Hero 2)安卓版v2.2v3.4.2
下载奥特曼之格斗超人内测版本 安卓最新版v11.0.0
下载奥特曼之格斗超人百度版 安卓版v11.0.0
下载奥特曼之格斗超人4399游戏盒版 最新安卓版v11.0.0
下载德凯奥特曼D闪光剑模拟器 安卓版v1.0
德凯奥特曼D闪光剑模拟器是一个非常有趣的奥特曼变身模拟器,可
亚刻觉醒器 安卓版v1.1
亚刻觉醒器模拟器是一个非常有趣的奥特曼变身模拟器,为喜欢亚刻
海上餐厅无限金币版 v1.0
海上餐厅免广告版是游戏的破解版本,在该版本中为玩家去除了广告
阿西美女室友竟然全解锁版 v1.0.2
阿西美女室友竟然内置菜单版是游戏的破解版本,在该版本中为玩家
我是大东家正版 最新版v1.2.738
我是大东家正版是一款放置类模拟经营手游,玩家将回到古代成为家