Mysql数据库一个字段内多个值如何统计个数 25

MySQL中(person)表中的一个字段Name是多值逗号分隔的,如下:selectnameformperson;Name-----------------------... MySQL中(person)表中的一个字段Name是多值逗号分隔的,如下:
select name form person;

Name
-----------------------------------------
a,b,c
a,b
a,c

想要的结果是下图,即要每个名称的个数有多少
名称 个数
-------------------
a 3
b 2
c 2
展开
 我来答
匿名用户
2014-01-15
展开全部



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

/**********
-- 获取字符串中有几个部分.
**********/
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)
未未bo
2014-08-21 · TA获得超过184个赞
知道答主
回答量:52
采纳率:0%
帮助的人:66.7万
展开全部
含有a的名称的个数:
select count(*) from person where Name like '%a%';
b和c同理
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
琳博领先
2014-01-14 · TA获得超过152个赞
知道答主
回答量:32
采纳率:0%
帮助的人:19.9万
展开全部
使用count方法
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
ritaswc
2014-01-14 · TA获得超过166个赞
知道小有建树答主
回答量:469
采纳率:50%
帮助的人:160万
展开全部
告诉你思路,先拿到每个数据,以“,”作为分隔符生成字符串数组
然后分析数组里面的值,进行累加
JAVA PHP c++等语言算法自己琢磨
本回答被网友采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 1条折叠回答
收起 更多回答(2)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式