好湿?好紧?好多水好爽自慰,久久久噜久噜久久综合,成人做爰A片免费看黄冈,机机对机机30分钟无遮挡

主頁 > 知識庫 > Mysql按條件計數(shù)多種實現(xiàn)方法詳解

Mysql按條件計數(shù)多種實現(xiàn)方法詳解

熱門標簽:地圖標注客戶付款 新鄉(xiāng)智能外呼系統(tǒng)好處 咸陽防封電銷卡 臨沂做地圖標注 石家莊400電話辦理公司 廣東400企業(yè)電話申請流程 宜賓全自動外呼系統(tǒng)廠家 申請400電話電話價格 許昌外呼增值業(yè)務線路

最近在給某網站的后臺添加一系列的統(tǒng)計功能,遇到很多需要按條件計數(shù)的情況。嘗試了幾種方法,下面簡要記錄,供大家參考。

問題描述

為使討論簡單易懂,我將問題稍作簡化,去掉諸多的背景。

從前有一個皇帝,他有50個妃子,這些妃子很沒有天理的給他生了100,000個兒子,于是,皇帝很苦惱,海量的兒子很難管理,而且,他想知道每個妃子給他生了多少個兒子,從而論功行賞,這很難辦。于是,皇帝請了一個程序員幫他編了一個程序,用數(shù)據(jù)庫來存儲所有的兒子的信息,這樣就可以用程序來統(tǒng)計和管理啦。

數(shù)據(jù)庫的結構如下:

id 皇子的唯一編號
mother 皇子母親的唯一編號

皇帝把妃子分成了兩個等級,天宮娘娘(編號小于25)和地宮娘娘(編號大于等于25),他想知道天宮娘娘們和地宮娘娘們的生育能力孰強孰弱。于是,程序員開始寫SQL Query了。

方法1:使用GROUP BY

SQL Query

SELECT COUNT(*) FROM `prince` GROUP BY `mother` > 24;

執(zhí)行結果

count(*)
50029
49971

在100,000行數(shù)據(jù)上的運行時間:0.0335 秒

分析

這種GROUP BY方法的最大問題在于:無法區(qū)分所得到的結果。這兩個數(shù)字哪一個是天宮娘娘們所生的皇子數(shù),哪一個是地宮娘娘們所生的皇子數(shù)呢?不知道。所以,盡管它統(tǒng)計出了總數(shù),但是沒有什么意義。

因此,為了區(qū)分統(tǒng)計結果,必須要把條件 mother > 24 也作為一個字段在結果集中作為一個字段體現(xiàn)出來,修改后的sql如下:

SELECT COUNT(*) AS `number`, `mother` > 24 AS `type` FROM `prince` GROUP BY `mother` > 24;

執(zhí)行結果

number type
50029 0
49971 1

條件表達式作為字段時,該字段的值就是該條件表達式的值,因此,對應我們的例子,type = 1 也就是表示 mother > 24 的值為1,因此,第二行中的數(shù)字代表地宮娘娘們所生的皇子數(shù)。

經過修改后,我們看出,天宮娘娘們略勝一籌。

優(yōu)缺點

缺點是顯而易見的,由于使用了條件表達式作為分組依據(jù),它只能做二元的劃分,對于要分成多類進行統(tǒng)計的情況不能夠勝任。比如要分別統(tǒng)計1~10號、11~24號,25號~50號妃子的產子數(shù),就無法實現(xiàn)了。

另外,由于使用了GROUP BY,因此涉及到排序,執(zhí)行時間上要更長。

我暫時沒有發(fā)現(xiàn)這種方法的優(yōu)點。

方法2:使用嵌套的SELECT

使用嵌套的SELECT也可以達到目的,在每個SELECT子句中統(tǒng)計一個條件下的數(shù)據(jù),然后用一個主SELECT把這些統(tǒng)計數(shù)據(jù)整合起來。

SQL Query

SELECT 
  ( SELECT COUNT( * ) FROM `prince` WHERE `mother` >24 ) AS `digong`, 
  ( SELECT COUNT( * ) FROM `prince` WHERE `mother` =24 ) AS `tiangong`

執(zhí)行結果

digong tiangong
49971 50029

在100,000行數(shù)據(jù)上的運行時間:0.0216 秒

分析

這種嵌套SELECT的方法非常直觀,就是分別統(tǒng)計各個條件下的數(shù)值,最后進行匯總,通俗易懂,跟自然語言沒啥區(qū)別了。

優(yōu)缺點

優(yōu)點就是直觀,而且速度也比GROUP BY要快。雖然是3條SELECT語句,看起來比GROUP BY的方案多了2條語句,但是它不涉及到排序,這就節(jié)省了很多時間。

缺點可能就是語句稍多,對語句數(shù)量有潔癖的同學可能會比較不舒服。

方法3:使用CASE WHEN

CASE WHEN語句的功能很強大,可以定義靈活的查詢條件,很適合進行分類統(tǒng)計。

SQL Query

SELECT 
  COUNT( CASE WHEN `mother` >24 THEN 1 ELSE NULL END ) AS `digong`, 
  COUNT( CASE WHEN `mother` =24 THEN 1 ELSE NULL END ) AS `tiangong`
FROM prince

執(zhí)行結果

digong tiangong
49971 50029

在100,000行數(shù)據(jù)上的運行時間:0.02365825 秒

分析

此方法的關鍵在于

COUNT( CASE WHEN `mother` >24 THEN 1 ELSE NULL END )

這里的COUNT和CASE WHEN聯(lián)合使用,做到了分類計數(shù)。先使用CASE WHEN,當滿足條件時,將字段值設置為 1, 不滿足條件時,將字段值設置為NULL,接著COUNT函數(shù)僅對非NULL字段進行計數(shù),于是,問題解決。

優(yōu)缺點

優(yōu)點嘛,此方法也不涉及到排序,因此運行時間上與方法2相當,SELECT語句減少到了 1 條。

缺點就是語句比較長,對語句長度有潔癖的同學可能會比較不舒服。

總結

對于確定分類的按條件計數(shù),可以盡量不用GROUP BY,從而避免排序動作,加速Query的執(zhí)行。

如果需要根據(jù)某個字段的值進行分類,而該字段的值是可變的,比如皇帝要統(tǒng)計每一個妃子的產子數(shù),而他可能不停的再娶很多妃子,這種情況下,使用方法2和方法3就不太靈光了,還是使用一個GROUP BY來得簡單便捷。

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。

您可能感興趣的文章:
  • 兩種方法實現(xiàn)mysql分組計數(shù),范圍匯總
  • 詳解mysql 獲取某個時間段每一天、每一個小時的統(tǒng)計數(shù)據(jù)
  • MySQL按時間統(tǒng)計數(shù)據(jù)的方法總結
  • mysql 獲取規(guī)定時間段內的統(tǒng)計數(shù)據(jù)
  • MySQL中實現(xiàn)高性能高并發(fā)計數(shù)器方案(例如文章點擊數(shù))
  • Mysql auto_increment 重新計數(shù)(讓id從1開始)
  • 用PHP和MYSQL建立計數(shù)器過程詳解

標簽:鷹潭 鎮(zhèn)江 合肥 北京 貴州 日照 阜新 臺灣

巨人網絡通訊聲明:本文標題《Mysql按條件計數(shù)多種實現(xiàn)方法詳解》,本文關鍵詞  Mysql,按,條件,計數(shù),多種,;如發(fā)現(xiàn)本文內容存在版權問題,煩請?zhí)峁┫嚓P信息告之我們,我們將及時溝通與處理。本站內容系統(tǒng)采集于網絡,涉及言論、版權與本站無關。
  • 相關文章
  • 下面列出與本文章《Mysql按條件計數(shù)多種實現(xiàn)方法詳解》相關的同類信息!
  • 本頁收集關于Mysql按條件計數(shù)多種實現(xiàn)方法詳解的相關信息資訊供網民參考!
  • 推薦文章
    主站蜘蛛池模板: 五月色婷婷久久综合| 美女张开腿给男人桶爽久久软件| 操女生网站| 继攵女乱h视频| 桃色激情网| 久久久久久久精品国裸体舞| 宝贝夹好上课(h)| 强行伸进她的小内裤疯狂揉摸视频| 国产精品欧美天天天天影视 | 拨开岳两片肥嫩的肉| 新有菜midv官网入口链接| 日本边添边摸边做边爱的边剧情简介 | 放荡村妇饥渴| 香蕉人在线香蕉人在线| jizzjiz熟丰满老妇日本| 日韩视频区| 青青一区二区三区无码视频| 全免费一级毛片免费看无码播放| 亚洲91国精产品自偷自偷| 男女性生活毛片| 久久精品免费一区二区三区 | 韩国午夜理伦三级试看| 娇妻与公绿帽瘾| 少妇高潮流白浆喷水的A片出| 长篇色情亂伦有声小说| 虐乳吊乳绑乳抽打| 催眠后宫yin肉H文| 麻豆波多野结衣| 美人受双腿大开贯穿bl| 二次元美女露着白嫩小奶头图| 陛下真紧H嘶爽老子H漫画| 黄色在线app| 玉芬慢慢的张开双腿| 牧场videos娇小k9| 久久久久久精品毛片A级桃花| 国产伦理一区| 久久99精品久久| 秋霞理伦最新电影网| 美女???免费视频观看| 一色桃子av人妻中文字幕| 免费看黄的软件大全|