MySQL数据库中,一个字段的值有多项内容,如何统计各项内容出现次数?

面对数据库中机构和科室的一对多关系,通过创建临时表、存储过程和转换操作,将关系转换为一对一,然后统计科室在字段内的出现次数。

1、遇到的问题

数据库中机构和科室是一对多的关系,多个科室存在一个字段中,现要统计各科室下的机构数。

2、解决思路

将一对多的关系转换成一对一的关系,再进行统计就简单了。

3、解决方法

第一步:创建临时表unit_temp,有一个字段uid

第二步:uid中插入数据0-N,N必须大于需要转换的机构总数。

我这边机构总数是125,所以准备插入200条数据。

此处有遇到了如何插入大量数据的问题。各种查找资料和尝试后,用了存储过程方法。具体参考:https://blog.csdn.net/weixin_39074559/article/details/89313594

DELIMITER $$
DROP PROCEDURE IF EXISTS `myproc`$$
CREATE PROCEDURE `myproc`()
BEGIN
        
        DECLARE init_data INTEGER DEFAULT 0;
       
        WHILE init_data <= 200 DO 
        
        
        	INSERT INTO unit_temp  VALUES(init_data);
        
        SET init_data = init_data + 1;
        
        END WHILE; 
END$$
DELIMITER ;
CALL myproc();

至此,临时表及数据构造完成。为什么必须从0开始,上面参考文章里有写,也可以自己试试从0开始和从1开始的区别。

第三步:将一对多转化成一对一。具体参考:https://www.cnblogs.com/hs2018/p/9446248.html

SELECT
    u.id,
    SUBSTRING_INDEX(
        SUBSTRING_INDEX(u.department, ',', t1.uid + 1),
        ',' ,- 1
    ) AS DATA
FROM
    ccrt_unit u
JOIN unit_temp t1 ON t1.uid < (
    LENGTH(u.department) - LENGTH(REPLACE(u.department, ',', '')) + 1
)
where u.id in  ('1','54');

第四步:统计各项出现次数。

select  t2.data,count(t2.id)

from 

(
SELECT
    u.id,
    SUBSTRING_INDEX(
        SUBSTRING_INDEX(u.department, ',', t1.uid + 1),
        ',' ,- 1
    ) AS DATA
FROM
    ccrt_unit u
JOIN unit_temp t1 ON t1.uid < (
    LENGTH(u.department) - LENGTH(REPLACE(u.department, ',', '')) + 1
)
where u.id in  ('1','54')
)t2
group by t2.data

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值