——为了今天要写的内容,运行了将近7个小时的程序,在数据库中存储了1千万条数据。—— 今天要说的是mysql数据库的IF()函数的一个实例。
具体场景以下,
先看看表结构:java
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;
具体要求是:分别统计系统通知和投诉建议两种消息的总条数、成功条数和失败条数。mysql
遇到这样的问题,咱们通常的思路就是用type分组,分别查询系统通知和投诉建议的总条数,而后用两个子查询来统计成功条数和失败条数。sql以下: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语句以下:code
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秒。是否是快多了。
那么,今天你学会了吗?it
若是文章对您有帮助,请记得点赞关注哟~ 欢迎你们关注个人公众号<情系IT>,每日推送技术文章供你们学习参考。class