——為了今天要寫的內容,執行了將近7個小時的程式,在資料庫中儲存了1千萬條資料。——今天要說的是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秒。是不是快多了。
那麼,今天你學會了嗎?
《情繫it>
mysql中if函式的正確使用姿勢
為了今天要寫的內容,執行了將近7個小時的程式,在資料庫中儲存了1千萬條資料。今天要說的是mysql資料庫的if 函式的乙個例項。具體場景如下,先看看表結構 create table message id varchar 30 not null,title varchar 30 default nul...
詳解MySQL中count函式的正確使用方法
詳解mysql中count函式的正確使用方法。1.描述 在mysql中,當我們需要獲取某張表中的總行數時,一般會選擇使用下面的語句 select count from table 其實count函式中除了 還可以放其他引數,比如常數 主鍵id 字段,那麼它們有什麼區別?各自效率如何?我們應該使用哪種...
Excel中MATCH函式的正確使用
excel中match函式是乙個很強大的輔助函式,match函式語法為 match lookup value,lookuparray,match type lookup value 表示查詢的指定內容 lookuparray 表示查詢的指定區域 match type 表示查詢的指定方式,用數字 1 ...