Mysql逗号拼接字符串的关联查询以及统计问题

 更新时间:2023年03月04日 11:49:53   作者:一只IT攻城狮  
有时为了数据库简洁,存放数据的时候,某一字段采用逗号隔开的形式进行存储,下面这篇文章主要给大家介绍了关于Mysql逗号拼接字符串的关联查询以及统计问题的相关资料,需要的朋友可以参考下

背景:

数据库中逗号拼接的字符串,想展示其完整拼接名称或者按其值统计处理,怎么做?

FIND_IN_SET函数和GROUP_CONCAT函数你会用吗?

一、查询问题

eg两张表 t_conclusion_detail(拜访信息表) 和 t_conclusion_info(拜访结论表)

t_conclusion_detail:

iduserNameconclusionIds
781918060586991616梦琪1,3
781986564770103296西施3
781989822074978304火舞2,3,4

t_conclusion_info:

conclusionIdconclusionName
1已成交
2暂无兴趣
3需要跟进
4沟通顺利

想要的效果:

iduserNameconclusionIdsconclusionNameStr
781918060586991616梦琪1,3已成交,需要跟进
781986564770103296西施3需要跟进
781989822074978304火舞2,3,4暂无兴趣,需要跟进,沟通顺利

思考🤔:

一般这种情况两种方案:要么代码层面处理,要么数据库层面处理

1、方案一( 代码层面):先查拜访信息表,将数据返回到服务器,在代码里进行切割,然后再去拜访结论表里面去查询对应的名称,返回到程序进行处理拼接。造成频繁访问数据库,或需要批量查回再匹配处理,这样做虽然很简单也很好理解但是效率太低。

2、方案二(数据库):以mysql为例,使用FIND_IN_SET函数和GROUP_CONCAT函数进行查询,但是数据量特别大时可能不友好,利用不上索引等

SELECT 
s.id,s.user_name userName,s.conclusion_ids conclusionIds,
(SELECT GROUP_CONCAT(user_name) 
FROM t_conclusion_info tr 
WHERE FIND_IN_SET(tr.conclusion_id,(SELECT conclusion_ids FROM t_conclusion_detail WHERE id=s.id))) AS conclusionNameStr
FROM t_conclusion_detail s 

tip:如果数据量特别大建议还是设计时不要逗号拼接设计,改成多表联查,或者使用代码层面处理

二、统计问题

还是上述两张表,想要的效果是每个结论出现频次的统计,即统计逗号拼接的字符串中内容

伪代码,具体根据情况拼接业务sql:

SELECT
sum(case when find_in_set('1',conclusion_ids)>0  then 1 else 0 end) one,
sum(case when find_in_set('2',conclusion_ids) >0 then 1 else 0 end) two,
sum(case when find_in_set('3',conclusion_ids) >0 then 1 else 0 end) three,
sum(case when find_in_set('4',conclusion_ids) >0 then 1 else 0 end) four
from t_conclusion_detail

结果:

onetwothreefour
1131

三、效率问题

思考🤔: 模拟插入20万数据,查看find_in_set效率问题:

CREATE TABLE `t_conclusion_detail` (
   `id` bigint unsigned NOT NULL AUTO_INCREMENT COMMENT '主键',
   `user_name` varchar(32) COMMENT '姓名',
   `conclusion_ids` varchar(32) COMMENT '拜访结论(多个结论逗号分隔)'
  PRIMARY KEY (`id`)    
) ENGINE=InnoDB AUTO_INCREMENT=1 COMMENT='拜访记录表'; 
DROP PROCEDURE IF EXISTS `t_conclusion_detail_memory`

DELIMITER //
CREATE PROCEDURE `t_conclusion_detail_memory`(IN n INT)
BEGIN
    DECLARE i INT DEFAULT 1;
    DECLARE id INT DEFAULT 1;
    DECLARE num1 INT DEFAULT 1;
    DECLARE num2 INT DEFAULT 1;
    DECLARE num3 INT DEFAULT 1;
    WHILE i < n DO
        SET id = i;
        SET num1 = FLOOR(0 + RAND()*6);
        SET num2 = FLOOR(0 + RAND()*6);
        SET num3 = FLOOR(0 + RAND()*6);
        INSERT INTO `t_conclusion_detail` VALUES (id, 'test', concat(num1,',',num2,',',num3), );
        SET i = i + 1;
    END WHILE;
END //
DELIMITER ;  -- 改回默认的 MySQL delimiter:';'

CALL t_conclusion_detail_memory(200000); 

经实验,20w数据时相关查询最慢2s左右,可接受范围。

总结

到此这篇关于Mysql逗号拼接字符串的关联查询以及统计问题的文章就介绍到这了,更多相关Mysql逗号拼接字符串查询内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • MySQL语句汇总整理

    MySQL语句汇总整理

    这篇文章主要给大家分享的是MySQL语句汇总整理,围绕MySQL语句的相关资料对其进行整理,具有一定的参考价值,需要的小伙伴可以参考一下,希望对你有所帮助
    2021-12-12
  • navicat无法远程连接mysql的解决方法

    navicat无法远程连接mysql的解决方法

    这篇文章主要介绍了navicat无法远程连接mysql的解决方法,需要的朋友可以参考下
    2014-04-04
  • mysql和oracle的区别小结(功能性能、选择、使用它们时的sql等对比)

    mysql和oracle的区别小结(功能性能、选择、使用它们时的sql等对比)

    这篇文章主要介绍了mysql和oracle的区别小结,主要包括功能性能、选择、使用它们时的sql等对比,需要的朋友可以参考下
    2020-02-02
  • SQL查询表字段信息详细图文教程

    SQL查询表字段信息详细图文教程

    最近工作用到SQL语句查询表中所有字段的名称,下面这篇文章主要给大家介绍了关于SQL查询表字段信息的相关资料,文中通过代码介绍的非常详细,需要的朋友可以参考下
    2024-03-03
  • 如何用命令行进入mysql具体操作步骤

    如何用命令行进入mysql具体操作步骤

    逛论坛时无意发现有个伙计提出这样的问题,如何用命令行进入mysql,搜集整理了一些特意贴出来与大家分享,感兴趣的你可以参考下希望对你有所帮助
    2013-03-03
  • mysql 5.7.21 winx64免安装版配置方法图文教程

    mysql 5.7.21 winx64免安装版配置方法图文教程

    这篇文章主要为大家详细介绍了mysql 5.7.21 winx64免安装版配置方法图文教程,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-02-02
  • Mysql MVCC多版本并发控制详情

    Mysql MVCC多版本并发控制详情

    这篇文章主要介绍了Mysql MVCC多版本并发控制详情,MVCC是一种并发控制的方法,一般在数据库管理系统中,实现对数据库的并发访问,在编程语言中实现事务内存,下文更多相关介绍需要的小伙伴可以参考一下
    2022-04-04
  • MySQL和Redis之间的存储区别

    MySQL和Redis之间的存储区别

    MySQL是一种关系型数据库,而Redis是一种键值对存储数据库,虽然它们都是用来存储和管理数据的,但是它们在很多方面都有不同,本文就给大家详细介绍一下MySQL和Redis之间的存储区别,感兴趣的同学可以参考一下
    2023-06-06
  • centos 6.9安装mysql的详细教程

    centos 6.9安装mysql的详细教程

    这篇文章主要介绍了centos 6.9安装mysql的详细教程,非常不错,具有参考借鉴价值,需要的朋友可以参考下
    2017-07-07
  • MySQL安装三种方法总结(yum安装、编译安装、二进制安装)

    MySQL安装三种方法总结(yum安装、编译安装、二进制安装)

    MySQL安装网上的教程有很多,基本上大同小异,但是安装软件有时就可能因为一个细节安装失败,这篇文章主要介绍了MySQL安装三种方法的相关资料,三种方法分别是yum安装、编译安装以及二进制安装,需要的朋友可以参考下
    2023-12-12

最新评论