mysql中if函数的正确使用姿式

——为了今天要写的内容,运行了将近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

相关文章
相关标签/搜索