MySQL 针对逗号拼接的数据字段转行思路

一、MySQL 针对逗号拼接的数据字段转行思路

MySQL 中我们有可能为了方便操作,有时会将一个字段存储多个信息,使用英文逗号隔开,当然这种情况属于对数据库的设计上有些欠妥。但如果遇到了这种情况又需要对数据进行统计的情况就有点棘手了,例如有下面爱好表

CREATE TABLE `user_hobby` (
  `id` int NOT NULL AUTO_INCREMENT,
  `name` varchar(255) DEFAULT NULL,
  `hobby` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;

其中 hobby 字段用来存储用户的爱好,如果多个采用的逗号拼接的方式,其中表中有如下数据:

INSERT INTO `test`.`user_hobby` (`id`, `name`, `hobby`) VALUES (1, '小明', '打篮球,踢足球');
INSERT INTO `test`.`user_hobby` (`id`, `name`, `hobby`) VALUES (2, '小红', '打乒乓球,打篮球,跑步');
INSERT INTO `test`.`user_hobby` (`id`, `name`, `hobby`) VALUES (3, '张三', '打羽毛球,游泳');
INSERT INTO `test`.`user_hobby` (`id`, `name`, `hobby`) VALUES (4, '李四', '跑步');
INSERT INTO `test`.`user_hobby` (`id`, `name`, `hobby`) VALUES (5, '王五', '踢足球,游泳');

下面需要统计分析每个爱好有多少人。

思路:使用 SUBSTRING_INDEX 和 UNION ALL

首先我们可以借助 UNION ALL 生成固定行数的编号,然后利用 SUBSTRING_INDEX 去除固定编号的内容出来:

SELECT u.id, u.name, SUBSTRING_INDEX(SUBSTRING_INDEX(u.hobby, ',', t.n), ',', -1) as hobby
FROM user_hobby u
JOIN (
    SELECT 1 as n UNION ALL SELECT 2 UNION ALL SELECT 3 UNION ALL SELECT 4 UNION ALL SELECT 5
) t
ON CHAR_LENGTH(u.hobby) - CHAR_LENGTH(REPLACE(u.hobby, ',', '')) >= t.n - 1
ORDER BY u.id, u.hobby;

在这里插入图片描述
下面就可以基于上述的结果进行分组统计了:

SELECT hobby,count(*) as total
FROM (
SELECT u.id, u.name, SUBSTRING_INDEX(SUBSTRING_INDEX(u.hobby, ',', t.n), ',', -1) as hobby
FROM user_hobby u
JOIN (
    SELECT 1 as n UNION ALL SELECT 2 UNION ALL SELECT 3 UNION ALL SELECT 4 UNION ALL SELECT 5
) t
ON CHAR_LENGTH(u.hobby) - CHAR_LENGTH(REPLACE(u.hobby, ',', '')) >= t.n - 1
) f GROUP BY hobby
ORDER BY total DESC

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/439715.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

直流负载原理与应用

直流负载是指能够消耗直流电能的设备或系统,在电力系统中,直流负载主要包括直流电动机、蓄电池、电解槽等。这些设备在运行过程中需要消耗大量的直流电能,因此对直流电源的稳定性和可靠性要求较高。本文将对直流负载的原理及其应用进行简要介…

二叉树(属性、修改与构造)

226. 翻转二叉树 题目 给你一棵二叉树的根节点 root ,翻转这棵二叉树,并返回其根节点。 示例 1: 输入:root [4,2,7,1,3,6,9] 输出:[4,7,2,9,6,3,1]答案 class Solution {public TreeNode invertTree(TreeNode roo…

python3安装chrome,chromedriver亲测有效

客户用python写了个脚本,需要用到chrome和chromedriver扩展,结果说安装不了,各种报错,好吧我来研究一下。众所周知linux自带python2.7,根据报错查了一下资料发现是版本冲突导致的,系统自带2.7,代…

针对ETC系统的OBE-SAM模块设计方案

ETC(Electrical Toll Collection)不停车收费是目前世界上最先进的路桥收费方式。通过安装在车辆挡风玻璃上的车载单元与安装在收费站 ETC 车道上的路侧单元之间的微波专用短程通讯,利用计算机联网技术与银行进行后台结算处理,从而…

typescript 学习

一.typescript是Javascript的超集,在javascript中添加特性的语言扩展,支持ES6标准。 二.typescript中新增了:类型批注和编译时类型检查,类型推断,类型擦除,接口,枚举,Mixin,泛型编程,名字空间,元组,await等 三.vscode 中怎样使用typescript 1. 安装VSCode (官网下…

SSL 证书,了解一下常识

公司的网站、应用怎么才能保证在互联网上安全运行,不被攻击、盗取数据呢? 创业必经之路,一步一步走就对了,可能没赶上红利期,但不做就等于0。 概述 SSL 证书(SSL Certificates)又称数字证书&am…

常见控件应用

常见控件应用 1.操作Ajax选项2.滑动滑块操作 1.操作Ajax选项 Ajax即Asynchronous JavaScript and XML(异步JavaScript和XML),是指一种创建交互式、快速动态网页应用的网页开发技术。通过在后台与服务器进行少量数据交换,Ajax可以…

Python与FPGA——图像锐化

文章目录 前言一、图像锐化二、Python robert锐化三、Python sobel锐化四、Python laplacian锐化五、FPGA sobel锐化总结 前言 在增强图像之前一般会先对图像进行平滑处理以减少或消除噪声,图像的能量主要集中在低频部分,而噪声和图像边缘信息的能量主要…

Spring Boot 生成与解析Jwt

Spring Boot 生成与解析Jwt Maven依赖 <dependency><groupId>io.jsonwebtoken</groupId><artifactId>jjwt</artifactId><version>0.9.1</version> </dependency>生成&解析 package yang;import io.jsonwebtoken.Claims…

DDS技术概述及测试策略与方案

随着车载通信技术的快速发展&#xff0c;传统的通信技术在满足车载通信需求方面面临着一些挑战。车载通信对实时性、可靠性以及通信带宽的需求越来越高&#xff0c;同时车载通信环境存在多路径衰落、信号干扰等问题&#xff0c;这些都给通信技术的选择和应用带来了一定的挑战。…

沐风老师3DMAX快速布尔QuickBoolean插件安装和使用教程

3DMAX快速布尔QuickBoolean插件安装和使用教程 3DMAX快速布尔QuickBoolean插件是一组工具&#xff0c;用于对具有预设轮廓的当前选定对象快速执行ProBoolean运算&#xff0c;如并集、相交、空心、修剪、减法、拆分和刀。 它的工作原理与SketchUp的Solid Tools非常相似&#xf…

qt如何配置ros环境

在Qt5.7的版本可以使用bash -i -c来启动qt&#xff0c;让Qt自己识别系统环境&#xff0c;不知道为什么Qt在之后的版本&#xff0c;这样使用都失效了。因为它会默认把CMAKE_PREFIX_PATH修改掉。 网上还有安装ros插件版本的qt creator&#xff0c;感觉失去了一些灵活性。 自己测试…

STM32CubeIDE基础学习-STM32CubeIDE软件配置下载器方法

STM32CubeIDE基础学习-STM32CubeIDE软件配置下载器方法 文章目录 STM32CubeIDE基础学习-STM32CubeIDE软件配置下载器方法前言第1章 配置ST-LINK下载器第2章 配置DAP下载器总结 前言 这个软件编译完之后&#xff0c;可以使用下载器进行在线下载程序或仿真调试程序&#xff0c;也…

高效办公-电脑软件安装简介

之前大概了解了一下应用软件就是在操作系统上面安装的一些办公软件。今天来学习下怎么下载软件、怎么安装、怎样卸载&#xff1f; 一、软件类型 电脑操作系统上可以根据自己的需求按照许多软件实现办公、影音娱乐等功能&#xff0c;大概分类有下面的一些&#xff0c;但是只是一…

设计模式(十):抽象工厂模式(创建型模式)

Abstract Factory&#xff0c;抽象工厂&#xff1a;提供一个创建一系列相关或相互依赖对 象的接口&#xff0c;而无须指定它们的具体类。 之前写过简单工厂和工厂方法模式(创建型模式)&#xff0c;这两种模式比较简单。 简单工厂模式其实不符合开闭原则&#xff0c;即对修改关闭…

Linux:kubernetes(k8s)允许在任意节点使用kubectl命令(5)

我们部署好了主节点以后&#xff0c;我们使用kubectl命令 一切正常&#xff0c;而我们到了别的node上使用 就显示一个这个 这个原因是因为我们开始就配置了master的一个配置文件&#xff0c;在/root/.kube/config 里&#xff0c;而我们的从节点不知道去找那个api接口所以就报…

一分钟安装使用教程,无需服务器,一台电脑就可使用!全网最快速便捷使用Claude 3方法!

随着AI的应用变广&#xff0c;各类AI程序已逐渐普及&#xff0c;尤其是在一些日常办公、学习等与撰写/翻译文稿密切相关的场景&#xff0c;大家都希望找到一个适合自己的稳定可靠的ChatGPT软件来使用。 ChatGPT-Next-Web就是一个很好的选择。它是一个Github上超人气的免费开源…

【mogoose】对查询的数据进行过滤不需要展示的信息

数据库结构如下 我只要email userName sex role 几个数据&#xff0c;其余不要 {_id: new ObjectId(65e7b6df8d06a0623fa899f5),email: 12345qq.com,pwd: $2a$10$eLJ9skKEsQxvzHf5X8hbaOXKtg8GCHBeieieSN6Usu17D2DPaI44i,userName: 默认昵称0769,sex: 0,token: {upCount: 0,_…

想交易盈利?Anzo Capital昂首资本发现了一本畅销书

要想在复杂多变的外汇市场中迅速加深了解并想通过交易每天都可以盈利&#xff0c;是通过每天阅读大量的书籍吗&#xff1f;是每天成为行业培训网络资源和论坛的常客吗&#xff1f;是通过花钱请有经验的交易者进行个人培训吗&#xff1f;还是进行EA交易呢&#xff1f; 都不是&a…

C# LINQ基础

LINQ基础 1. 入门2. 运算符流语法2.1 连续使用查询运算符2.2 使用Lambda表达式2.2.1 Lambda表达式及Func的方法签名2.2.2 Lambda表达式和元素类型2.2.3 自然排序2.2.4 其他查询运算符 3 查询表达式4 延迟执行4.1 重复执行4.2 捕获的变量4.3 延迟加载的工作原理4.4 查询语句的执…