当前位置: 首页 > news >正文

mysql 将一个列按逗号分割为多列

在MySQL中,将一个列按逗号分割为多列通常需要使用字符串函数,如SUBSTRING_INDEX(),配合UNION ALL或CROSS JOIN等操作来实现。

假设有一个表my_table,它有一个列tags,其中存储了逗号分隔的标签值,如下所示:

CREATE TABLE my_table (id INT AUTO_INCREMENT PRIMARY KEY,date DATE,tags VARCHAR(255)
);INSERT INTO my_table (date, tags) VALUES
('2024-06-01', 'tag1'),
('2024-06-11', 'tag1,tag2'),
('2024-06-21', 'tag1,tag2,tag3');

如果想要统计每个标签在特定时间段内的出现次数,可以先拆分tags列,然后进行计数。

下面的例子中,它首先创建一个临时表来存储拆分后的标签,然后进行计数:

-- 统计每个标签的出现次数
SELECT split_tags.tag, COUNT(*) AS count
FROM 
-- 创建临时表存储拆分的标签
(SELECT id, date, SUBSTRING_INDEX(SUBSTRING_INDEX(tags, ',', numbers.n), ',', -1) AS tagFROM my_tableCROSS JOIN (SELECT a.N + b.N * 10 + 1 nFROM (SELECT 0 AS N UNION ALL SELECT 1 UNION ALL SELECT 2 UNION ALL SELECT 3 UNION ALL SELECT 4 UNION ALL SELECT 5 UNION ALL SELECT 6 UNION ALL SELECT 7 UNION ALL SELECT 8 UNION ALL SELECT 9) aCROSS JOIN (SELECT 0 AS N UNION ALL SELECT 1 UNION ALL SELECT 2 UNION ALL SELECT 3 UNION ALL SELECT 4 UNION ALL SELECT 5 UNION ALL SELECT 6 UNION ALL SELECT 7 UNION ALL SELECT 8 UNION ALL SELECT 9) bORDER BY n) numbersWHERE n <= 1 + LENGTH(tags) - LENGTH(REPLACE(tags, ',', '')) -- 确保只拆分必要的次数
) AS split_tags
WHERE split_tags.date BETWEEN '2024-06-01' AND '2024-06-31' -- 更改日期范围以适应实际需求
GROUP BY split_tags.tag;

这个查询首先使用CROSS JOIN和数字表生成器来创建一个数字序列,用于拆分tags列。

然后,它使用SUBSTRING_INDEX()来提取每个标签,并在临时表split_tags中存储它们。

最后,它计算每个标签在指定日期范围内的出现次数。


请注意:

这个查询假设tags列中的值不会超过100个(即10 * 10 + 1)。

如果可能有更多值,你需要扩大数字表生成器以覆盖所有可能的值。

如果值的数量是不确定的,可能需要在应用程序中处理这种情况,或者使用存储过程来动态生成SQL。

http://www.lryc.cn/news/390099.html

相关文章:

  • Vue 3中 <script setup> 与生命周期钩子函数的详细解析
  • 一篇文章入门主成分分析PCA
  • Android系统为什么lmkd杀到adj 100就代表有低内存?
  • d嘤嘤不想求异或喵(牛客周赛49)
  • java反射-动态调用方法
  • ThreadLocal作用
  • Python基础入门知识
  • uniapp——据用户角色显示或隐藏部分功能权限。
  • JCR一区级 | Matlab实现BO-Transformer-LSTM多变量回归预测
  • 软件开发环境-系统架构师(二十一)
  • AI与大模型工程师证书研修班报名啦!
  • ctfshow-web入门-命令执行(web56、web57、web58)
  • controller不同的后端路径对应vue前端传递数据发送请求的方式,vue请求参数 param 与data 如何对应后端参数
  • 【FFmpeg】avcodec_send_frame函数
  • python获取字符编码
  • 通过MATLAB控制TI毫米波雷达的工作状态之实时数据采集
  • 华为HCIP Datacom H12-821 卷21
  • MySQL之应用层优化(二)
  • Java源码解读之常量52429
  • “Photoshop AI插件:StartAI的全面使用攻略
  • 入门Axure:快速掌握原型设计技能
  • Java中的序列化与反序列化详解
  • 在鸿蒙开发中如何实现皮肤切换?
  • FlowUs新一代内容创作营销平台|FlowUs息流国产 好用 不限速
  • WebSocket解决方案(springboot 基于Redis发布订阅)
  • 如何优化网站SEO排名?
  • 基于Java的音乐网站系统-计算机毕业设计源码01239
  • 云原生之容器编排实践-OpenEuler23.09在线安装Kubernetes与KubeSphere
  • Ubuntu 截图shutter,图像编辑 gimp,录屏kazam
  • WSO2 products 文件上传漏洞(CVE-2022-29464)