CREATE?TABLE?person?(
網(wǎng)站建設(shè)公司,為您提供網(wǎng)站建設(shè),網(wǎng)站制作,網(wǎng)頁(yè)設(shè)計(jì)及定制網(wǎng)站建設(shè)服務(wù),專注于企業(yè)網(wǎng)站設(shè)計(jì),高端網(wǎng)頁(yè)制作,對(duì)陽(yáng)光房等多個(gè)行業(yè)擁有豐富的網(wǎng)站建設(shè)經(jīng)驗(yàn)的網(wǎng)站建設(shè)公司。專業(yè)網(wǎng)站設(shè)計(jì),網(wǎng)站優(yōu)化推廣哪家好,專業(yè)seo優(yōu)化排名優(yōu)化,H5建站,響應(yīng)式網(wǎng)站。
name??varchar(20)
);
INSERT?INTO?person?VALUES?('a,b,c');
INSERT?INTO?person?VALUES?('a,b');
INSERT?INTO?person?VALUES?('a,c');
DELIMITER?//
DROP?FUNCTION?GetTextCount?//
/**********
--?獲取字符串中有幾個(gè)部分.
**********/
CREATE?FUNCTION?GetTextCount(pSourceText??VARCHAR(255),??pDivChar??CHAR(1))
RETURNS?TINYINT
BEGIN
--?預(yù)期結(jié)果.?
DECLARE?vResult?TINYINT;
--?當(dāng)前逗號(hào)的位置.
DECLARE?vIndex?INT;
--?前一個(gè)逗號(hào)的位置.
DECLARE?vPrevIndex?INT;
--?結(jié)果的初始值.
SET?vResult?=?1;
--?查詢第一個(gè)?逗號(hào)的位置.
SET?vIndex?=?INSTR(pSourceText,?pDivChar);
IF?vIndex?=?0?THEN
--?參數(shù)中沒(méi)有逗號(hào),直接返回.
RETURN?vResult;
END?IF;
--?初始化情況,前一個(gè)逗號(hào)不存在.
SET?vPrevIndex?=?0;
--?循環(huán)處理。
WHILE?vIndex??0?DO
--?結(jié)果遞增.
SET?vResult?=?vResult?+?1;
--?前一個(gè)逗號(hào)的位置?=?當(dāng)前逗號(hào)的位置
SET?vPrevIndex?=?vIndex;
--?查詢下一個(gè)逗號(hào)的位置.
SET?vIndex?=?LOCATE(pDivChar,??pSourceText,??vPrevIndex?+?1);
END?WHILE;
--?返回結(jié)果.
RETURN?vResult;
END;
//
DROP?FUNCTION?GetTextValue?//
/**********
--?獲取字符串中具體某一個(gè)部分的數(shù)據(jù).
**********/
CREATE?FUNCTION?GetTextValue(pSourceText??VARCHAR(255),??pDivChar??CHAR(1),?pIndex??TINYINT)
RETURNS?VARCHAR(255)?
BEGIN
--?預(yù)期結(jié)果.?
DECLARE?vResult?VARCHAR(255);
IF?pIndex?=?1?THEN
SELECT?SUBSTRING_INDEX(pSourceText,??pDivChar,??1)??INTO??vResult;
ELSE
SELECT?
REPLACE(
SUBSTRING_INDEX(pSourceText,??pDivChar,??pIndex),
CONCAT(SUBSTRING_INDEX(pSourceText,??pDivChar,??pIndex?-?1)?,?pDivChar),
'')?INTO??vResult;
END?IF;
--?返回.
RETURN?vResult;
END;
//
DELIMITER?;
SELECT
GetTextValue(t.name,?',',?MaxNum.No)?AS?`名稱`,
COUNT(*)?AS?`個(gè)數(shù)`
FROM
person?t,
(SELECT?1?No?UNION?ALL
?SELECT?2?No?UNION?ALL
?SELECT?3?No?UNION?ALL
?SELECT?4?No?UNION?ALL
?SELECT?5?No?)?MaxNum
WHERE
GetTextCount(t.name,?',')?=?MaxNum.No
GROUP?BY
GetTextValue(t.name,?',',?MaxNum.No);
+------+------+
|?名稱?|?個(gè)數(shù)?|
+------+------+
|?a????|????3?|
|?b????|????2?|
|?c????|????2?|
+------+------+
3?rows?in?set?(0.01?sec)
2020-03-01
對(duì)于count的函數(shù)的使用,我們常見(jiàn)的一個(gè)錯(cuò)誤是在括號(hào)內(nèi)隨意指定一個(gè)列去統(tǒng)計(jì)結(jié)果集的行數(shù)。但只有指定的行確實(shí)都是有值的時(shí)候,統(tǒng)計(jì)的才是實(shí)際的行數(shù),否則可能統(tǒng)計(jì)的結(jié)果并不是實(shí)際的行數(shù)。而對(duì)于MyISAM存儲(chǔ)引擎,如果某一列的值確實(shí)不可能為null時(shí),MySQL內(nèi)部就會(huì)將count()函數(shù)優(yōu)化成count(*),若沒(méi)有帶where條件,此時(shí)計(jì)算速度是非常快的,因?yàn)榇藭r(shí)沒(méi)有實(shí)際的去計(jì)算表的行數(shù)。
總結(jié): 對(duì)于MyISAM存儲(chǔ)引擎,不帶where條件的count(*)是非常快的。
技巧:
利用上述MyISAM的count(* )特性,加速一些特定查詢條件的count()查詢。
如:
對(duì)于select count(* ) from tablename where id 10; 可以做如下的反轉(zhuǎn)查詢:
select (select count(* ) from tablename) - count(* ) from tablename where id 10;
因?yàn)檫@樣在查詢階段MySQL將子查詢當(dāng)做一個(gè)常數(shù)來(lái)處理,大大減少了掃描的行數(shù)。
以時(shí)間為跨度統(tǒng)計(jì)不同的值,在該時(shí)間出現(xiàn)的次數(shù)。
語(yǔ)言如下:
select count(*),'列名' from tablename group by '列名'
select count(*),a_yqm from user group by a_yqm
舉例:
這里,我要查詢出1年內(nèi)每個(gè)月份periods字段不同值的次數(shù)。
比如下圖中可見(jiàn)的2015-4月,periods為2出現(xiàn)了3次,3出現(xiàn)了1次,最關(guān)鍵的是 periods你不知道有多少種可能的值,也許這個(gè)月有1,也許沒(méi)有。
新聞標(biāo)題:mysql中怎么統(tǒng)計(jì)個(gè)數(shù)的簡(jiǎn)單介紹
文章路徑:http://www.chinadenli.net/article28/hpgpjp.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站設(shè)計(jì)公司、虛擬主機(jī)、品牌網(wǎng)站設(shè)計(jì)、全網(wǎng)營(yíng)銷推廣、網(wǎng)站策劃、微信公眾號(hào)
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)