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