mysql 数据库 字段数量_Mysql数据库一个字段内多个值如何统计个数

展开全部

CREATE TABLE person (

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 //

/**********

-- 获取字符串中有e69da5e887aa62616964757a686964616f31333335303533几个部分.

**********/

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)

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值